在Golang中,运行函数
是否可以err, value := function()
if err == nil {
return value
}
而不是这样做:
err, value := function()
if err != nil {
panic(err)
}
return err
如果是这样,有没有时间优势/奖金?
这不是非致命错误。我试图将某些东西转换成不同的类型,我不确定应该使用哪种类型。
答案 0 :(得分:2)
恐慌类似于异常,但没有传递给来电者(也就是当你打电话恐慌时,它会发生在那里;你不会等待)。您应该使用代码的第一个示例,您可以在其中尝试操作,失败并继续。
func main() {
s1 := rand.NewSource(time.Now().UnixNano())
r1 := rand.New(s1)
// Generate some random numbers, and call into add()
for i := 0; i < 10; i++ {
s, err := add(r1.Intn(100), r1.Intn(100))
if err != nil {
fmt.Println(err)
continue
}
fmt.Println(s)
}
}
// Error if we get a sum over 100
func add(a int, b int) (int, error) {
s := a + b
if s > 100 {
return s, errors.New("Hey doofus, error!")
}
return s, nil
}
如果你在这个例子中感到恐慌,你就完成了(尝试它 - 而不是回复错误做恐慌(&#34;有些错误&#34;)。但相反,我们确定&# 39;是一个错误,我们可以尝试生成另一个随机数。
就像其他人说的那样,如果你有一个用例,你只是无法恢复(说你试图从文件中读取,但文件不在那里),你可能会认为恐慌更好。但是如果你有一个长时间运行的过程(比如API),你会想要继续搅拌,尽管有任何错误。
GoPlay:http://play.golang.org/p/ThXTxVfM6R
OP已经用一个用例更新了他的帖子 - 他试图转换为一个类型。如果你对这个功能感到恐慌,你就会死在水里。相反,我们想要返回一个错误,让调用者决定如何处理错误。以此为例:func interfaceToString(i interface{}) (string, error) {
if i == nil {
return "", errors.New("nil interface")
}
switch i.(type) {
case string:
return i.(string), nil
case float64:
return strconv.Itoa(int(i.(float64))), nil
case int:
return strconv.Itoa(i.(int)), nil
}
return "", errors.New(fmt.Sprintf("Unable to convert %v", i))
}