Guava Preconditions允许轻松检查Java中的方法参数。
public void doUsefulThings(Something s, int x, int position) {
checkNotNull(s);
checkArgument(x >= 0, "Argument was %s but expected nonnegative", x);
checkElementIndex(position, someList.size());
// ...
}
如果不满足条件,这些检查方法会引发异常。
Go没有例外,但表示返回值有错误。所以我想知道上面代码的惯用Go版本是什么样的。
答案 0 :(得分:2)
这取决于背景。
如果doUsefulThings
是从包导出的公共函数,则返回error
。您可以导出可以返回的包级别error
变量,并且调用者可以检查返回的error
是否等于记录的方法之一。
如果它没有被导出,并且错误地调用它会导致程序员错误,我认为panic(errors.New("bla bla bla"))
是合理的。虽然一旦取消引用该指针,该函数就会出现恐慌。
为此:checkArgument(x >= 0, "Argument was %s but expected nonnegative", x)
您可以传递uint
。
答案 1 :(得分:1)
我不确定使用断言来检查参数的基本属性是在语言的哲学中。
如果参数确实可能有无效值而没有错误(例如,您在数据库中找不到它),则会返回错误:
func doUsefulThings(s *Something) error {
// return an error if your algorithm detect an invalid value
断言s
不是nil
只会增加冗长度。没有必要验证您没有提供nil
。
添加返回参数,尤其是error
会强制所有用户检查此错误。不要在函数中编写代码来防御调用者代码中的琐碎错误。在调用你的函数之前,调用者应该只测试它不是nil
,,如果可能的话,取决于代码的其余部分。