我处于一个可以返回多达5个不同错误的函数的情况下,但是我不确定Go中的约定是否正确。我在下面做了一个小的MSVC示例来说明我的问题。
使用if语法阻止作用域我的错误。
if err := validatePassword(password); err != nil {
return err
}
if passwordHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost); err != nil {
return err
}
或以不同的方式命名每个错误(似乎很麻烦...)
errValidatePassword := validatePassword(password)
if errValidatePassword != nil {
return errValidatePassword
}
passwordHash, errPasswordHash := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if errPasswordHash != nil {
return errPasswordHash
}
或使用命名返回。
func registerAccount(email string, password string) (err error) {
err = validatePassword(password)
if err != nil {
return err
}
// POSSIBLE ISSUE HERE as err already been inistalised????
passwordHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return err
}
}
答案 0 :(得分:1)
在编码时问一个很好的问题,但是没有一个完美的答案。通常,在Go中通常会像方法1或方法3一样处理错误。
答案 1 :(得分:0)
最后一个例子是我在大多数地方看到的。例如https://github.com/kubernetes/kubernetes/blob/master/cmd/genutils/genutils.go
编译器不会将其检测为重定义,因为该表达式至少具有一个新变量。
答案 2 :(得分:0)
给出最后一个示例,一个解决方案是不使用命名的返回变量,并为每个功能块引入作用域
package main
func registerAccount(email string, password string) error {
if err := validatePassword(password); err != nil {
return err
}
var passwordHash []byte
{
x, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return err
}
passwordHash = x
}
return nil
}
请注意,如果您充分利用变量的语法,则if的作用域已定。