如何处理来自Golang中功能选项的错误

126 阅读1分钟

在有些情况下,你想使用的选项可能会返回一个错误。根据返回的结果,你将继续或终止这个过程。这个简单的例子将帮助你处理来自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