Documentation
¶
Overview ¶
Package zerokit helps with zero value related use-cases such as initialisation.
Index ¶
- func Coalesce[T any](vs ...T) T
- func Init[T any, I *T | func() T](ptr *T, init I) T
- func InitErr[T any](ptr *T, init func() (T, error)) (T, error)
- func InitErrWith[T any, L *sync.RWMutex | *sync.Mutex](ptr *T, l L, init func() (T, error)) (T, error)
- func InitWith[T any, L *sync.RWMutex | *sync.Mutex | *sync.Once](ptr *T, l L, init func() T) T
- func IsZero[T any](v T) (ok bool)
- type V
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Coalesce ¶
func Coalesce[T any](vs ...T) T
Coalesce will return the first non-zero value from the provided values.
Example ¶
package main import ( "go.llib.dev/frameless/pkg/zerokit" ) func main() { _ = zerokit.Coalesce("", "", "42") // -> "42" }
func Init ¶
func Init[T any, I *T | func() T](ptr *T, init I) T
Init will initialise a zero value through its pointer (*T), If it's not set, it assigns a value to it based on the supplied initialiser. Init is safe to use concurrently, it has no race condition.
Example ¶
package main import ( "go.llib.dev/frameless/pkg/zerokit" ) func main() { type MyType struct { V string } var mt MyType _ = zerokit.Init(&mt.V, func() string { return "default value from a lambda" }) var defaultValue = "default value from a shared variable" _ = zerokit.Init(&mt.V, &defaultValue) }
func InitErr ¶ added in v0.266.0
InitErr will initialise a zero value through its pointer (*T), If it's not set, it assigns a value to it based on the supplied initialiser function. InitErr is safe to use concurrently, it has no race condition.
If the initialiser function encounters an InitErr failure, it will leave the provided *T pointer unassigned, allowing subsequent calls to attempt initialization again.
Example ¶
package main import ( "fmt" "go.llib.dev/frameless/pkg/zerokit" ) func main() { var val string got, err := zerokit.InitErr(&val, func() (string, error) { return "foo", fmt.Errorf("some error might occur, it will be handled") }) _, _ = got, err }
func InitErrWith ¶ added in v0.292.0
Types ¶
type V ¶ added in v0.214.0
type V[T any] struct { // contains filtered or unexported fields }
V is a type that can initialise itself upon access (V.Get). Map, Slice, Chan types are made, while primitive types returned as zero value. Pointer types are made with an initialised value.
V is not thread safe, it just makes initialisation at type level in struct fields more convenient. The average cost for using V is low, see the benchmark for more
Example ¶
package main import ( "go.llib.dev/frameless/pkg/zerokit" ) func main() { type MyStructType struct { fields zerokit.V[*[]string] foundKeys zerokit.V[map[string]struct{}] } var mst MyStructType mst.foundKeys.Get() }