返回可选值和可能错误的函数的最佳签名是什么?
例如:
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)
(制造特殊错误似乎很痛苦.)
什么是最惯用的方法?
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)