我的情况是,我有一个函数可以返回最多 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 } }
3 回答
一只甜甜圈
TA贡献1836条经验 获得超5个赞
最后一个例子是我在大多数地方看到的。例如https://github.com/kubernetes/kubernetes/blob/master/cmd/genutils/genutils.go
编译器不会将其检测为重新定义,因为该表达式至少有一个新变量。
慕神8447489
TA贡献1780条经验 获得超1个赞
给出最后一个例子,一个解决方案是不使用命名返回变量,并为每个功能块引入作用域
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 已经确定了变量的作用域。
- 3 回答
- 0 关注
- 144 浏览
添加回答
举报
0/150
提交
取消