返回一个可选值和一个错误

huangapple go评论101阅读模式
英文:

Returning an optional value and an error

问题

返回翻译结果:

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

例如:

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

(空的RGB值是黑色,是一个有效的颜色,所以你不能用它来推断没有找到值。假设错误可能来自于像数据库连接这样的东西。)

两个最好的选项是使用布尔返回值:

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

c, ok, err := findColor(myname)

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

...

或者使用特殊的错误值:

var ColorNotFound = errors.New(...)

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

c, err := findColor(...)

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

...

(创建特殊错误似乎很麻烦。)

什么是最符合惯用法的方法?

英文:

What's the best signature for a function that returns an optional value and a possible error?

For example:

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

(The empty RGB value is black, a valid color, so you can't use it to infer that no value was found. Assume the error might come from something like a database connection.)

The two options that seem best are a boolean return value:

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

c, ok, err := findColor(myname)

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

...

Or a special error value:

var ColorNotFound = errors.New(...)

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

c, err := findColor(...)

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

...

(Making special errors seems like a pain.)

What's the most idiomatic approach?

答案1

得分: 17

在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 {
    // 如果是ColorNotFound,做一些特殊处理...
} else if err != nil {
    // 其他类型的错误...
}
英文:

The convention in Go is to return (value, error) and if error != nil then value is (or may be) invalid.

If you have special errors you need to do something with (like io.EOF) then making a specific error is normal practice. So I would say your 3rd example is the most idiomatic, if you want to do something different for 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...
}

答案2

得分: 3

你可以让findColor函数返回*RGB类型,并将其与nil进行比较:

c, err := findColor(name)
if err != nil { /* 处理错误 */ }
if c == nil { /* 处理找不到颜色的情况 */ }

不过这种做法是不安全的,因为如果你尝试在一个nil指针上调用方法,会导致程序崩溃。

我建议你使用一个特殊的ErrColorNotFound方法来处理。

英文:

You could make findColor return *RGB and then compare it to nil:

c, err := findColor(name)
if err != nil { /* Handle error. */ }
if c == nil { /* Handle no color. */ }

This is unsafe though, since if you try to call methods on a nil pointer, they can cause a panic.

I'd recommend sticking with a special ErrColorNotFound approach.

huangapple
  • 本文由 发表于 2014年11月12日 15:14:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/26881252.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定