Support user-friendly, type-safe optionals in Go.
value = option.Some(4)
no_value = option.None[int]()This package adds a single type, the Option. Option's are instantiated as
one of two variants. Some denotes the presence of a value and None denotes
the absence.
Historically pointers have been used to denote optional values, this package removes the risk of null pointer exceptions by leveraging generics to implement type-safe optional values.
Options can be tested for the presence of a value:
two = option.Some(2)
if two.IsSome() {
...
}Values can be extracted along with a boolean test for their presence:
two = option.Some(2)
if value, ok := two.Value(); ok {
...
}Optionals that you're sure have a value can be "unwrapped":
two := option.Some(2)
two.Unwrap() // returns 2Accessing a value on a None variant will cause a runtime panic.
none := option.None[int]()
none.Unwrap() // panicsUse of a package like this may be pervasive if you really commit to it. This
package was inspired by Rust's options implemenation. It might be worth
considering dropping the repetative option. preceding the variants. Since
importing names into the global namespace is to be avoided, the following
import pattern may work for you:
import (
"fmt"
"github.com/BooleanCat/option"
)
var (
Some = option.Some
None = option.None
)
func main() {
two := Some(2)
fmt.Println(two)
}