在有些情况下,你想使用的选项可能会返回一个错误。根据返回的结果,你将继续或终止这个过程。这个简单的例子将帮助你处理来自Golang中功能选项的错误。
car.go
package car
import "fmt"
type option func() (func(*Car), error)
func success(opt func(*Car)) option {
return func() (func(*Car), error) {
return opt, nil
}
}
func failure(err error) option {
return func() (func(*Car), error) {
return nil, err
}
}
type Car struct {
make string
model string
}
func New(options ...option) (*Car, error) {
car := &Car{}
for _, option := range options {
opt, err := option()
if err != nil {
return nil, err
}
opt(car)
}
return car, nil
}
func WithMake(val string) option {
if val == "ford" {
return failure(fmt.Errorf("make: we do not produce %s", val))
}
return success(func(c *Car) {
c.make = val
})
}
func WithModel(val string) option {
return success(func(c *Car) {
c.model = val
})
}
测试
package main
import (
"log"
"practise/car"
)
func main() {
// Without any options.
car1, err := car.New()
if err != nil {
log.Fatalln(err)
}
log.Printf("%+v\n", car1)
// With valid options.
car2, err := car.New(car.WithMake("bmw"), car.WithModel("m3"))
if err != nil {
log.Fatalln(err)
}
log.Printf("%+v\n", car2)
// With valid options.
car3, err := car.New(car.WithMake("ford"), car.WithModel("mustang"))
if err != nil {
log.Fatalln(err)
}
log.Printf("%+v\n", car3)
}
$ go run .
2020/06/09 00:00:08 &{make: model:}
2020/06/09 00:00:08 &{make:bmw model:m3}
2020/06/09 00:00:08 make: we do not produce ford
exit status 1