返回可选值和错误

ind*_*dil 2 go

返回可选值和可能错误的函数的最佳签名是什么?

例如:

func findColor(name string) (RGB, error) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

(空RGB值为黑色,是有效颜色,因此您无法使用它来推断未找到任何值.假设错误可能来自类似数据库连接的内容.)

看起来最好的两个选项是布尔返回值:

func findColor(name string) (RGB, bool, error) {
    ...
}

c, ok, err := findColor(myname)

if !ok {
    ...
} else if err != nil {
    ...
}

...
Run Code Online (Sandbox Code Playgroud)

或者一个特殊的错误值:

var ColorNotFound = errors.New(...)

func findColor(name string) (RGB, error) {
    ...
}

c, err := findColor(...)

if err == ColorNotFound {
    ...
} else if err != nil {
    ...
}

...
Run Code Online (Sandbox Code Playgroud)

(制造特殊错误似乎很痛苦.)

什么是最惯用的方法?

Nic*_*ood 6

Go中的约定是返回(value, error),如果error != nil那时value(或可能是)无效.

如果你有特殊的错误,你需要做一些事情(如io.EOF),然后发出一个特定的错误是正常的做法.所以我想说你的第三个例子是最惯用的,如果你想做一些不同的事情ColorNotFound.

var ColorNotFound = errors.New(...)

func findColor(name string) (RGB, error) {
    // ...
}

c, err := findColor(...)

if err == ColorNotFound {
    // Do something special if ColorNotFound...
} else if err != nil {
    // Some other kind of error...
}
Run Code Online (Sandbox Code Playgroud)