Skip to content

Some (Nil Safety)

Have you ever seen this panic? Something happens when you access data from nil pointer.

panic: runtime error: invalid memory address or nil pointer dereference

Package some will help you to prevent this problem by wrapping nilable value and way to access it.

Some

A struct that contains the value and state of existence. If there is value, state will be true.

Get

Value getter that returns the value and existence state. If you call this, you need to store two variables.

go
func Get() (YourType, bool)

Example:

go
product, ok := some.Some[Product]{}.Get()
if !ok {
    fmt.Println("product is not found")
    return
}
...

IsPresent

Check existence of value, returns true if value exists.

go
func IsPresent() bool

Example:

go
ok := some.Some[Product]{}.IsPresent()
if !ok {
    fmt.Println("product is not found")
    return
}
...

OrElse

Get value with default value if not exists.

go
func OrElse(defaultValue) YourType

Example:

go
defaultValue := Product{Name: "terang bulan"}
product := some.Some[Product]{}.OrElse(defaultValue)
...

OrElseFunc

Get value but if not exists, it will run function to get default value.

go
func OrElseFunc(func() YourType) YourType

Example:

go
product := some.Some[Product]{}.OrElseFunc(func() Product {
    return Product{Name: "terang bulan"}
})
...

OrPanic

Get value but if not exists, it will panic. You can put an error as parameter, it will be used as message.

go
func OrPanic(...error) YourType

Example:

go
product := some.Some[Product]{}.OrPanic()
...

IfPresent

Receive a callback function that will be called when the value is present.

go
func IfPresent(func(value YourType))

Example:

go
some.Some[Product]{}.IfPresent(func(product Product) {
    ...
})

Helpers

Functions that help you to use some easily.

Empty

Create empty data with defined type.

go
some.Empty[YourType]()

Example:

go
product := some.Empty[Product]()

Of

Wrap data as nil safely. No need to define the data type here, because it will be automatically recognized by data given.

go
some.Of(yourData)

Example:

go
product := some.Of(Product{})

Released under the MIT License.