英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论