// run // Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import ( "errors" "fmt" ) type Option[T any] struct { ok bool val T } func (o Option[T]) String() string { if o.ok { return fmt.Sprintf("Some(%v)", o.val) } return "None" } func Some[T any](val T) Option[T] { return Option[T]{ok: true, val: val} } func None[T any]() Option[T] { return Option[T]{ok: false} } type Result[T, E any] struct { ok bool val T err E } func (r Result[T, E]) String() string { if r.ok { return fmt.Sprintf("Ok(%v)", r.val) } return fmt.Sprintf("Err(%v)", r.err) } func Ok[T, E any](val T) Result[T, E] { return Result[T, E]{ok: true, val: val} } func Err[T, E any](err E) Result[T, E] { return Result[T, E]{ok: false, err: err} } func main() { a := Some[int](1) b := None[int]() fmt.Println(a, b) x := Ok[int, error](1) y := Err[int, error](errors.New("test")) fmt.Println(x, y) // fmt.Println(x) _, _, _, _ = a, b, x, y }