如何检查Go中的函数参数

时间:2012-09-24 15:35:36

标签: java validation go guava preconditions

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版本是什么样的。

2 个答案:

答案 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,如果可能的话,取决于代码的其余部分