如何在Go中检查函数参数

4

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个回答

2

这要看具体情况。

如果doUsefulThings是从一个包中公开的函数,那么返回一个error。你可以定义一个导出的包级别error变量来返回错误信息,调用者可以检查返回的error是否等于文档中记录的错误信息之一。

如果它没有被公开,而且错误的调用会导致程序员的错误,我认为使用panic(errors.New("bla bla bla"))是合理的。虽然无论如何,一旦你解引用了指针,该函数也会引发panic。

对于这个:checkArgument(x >= 0, "Argument was %s but expected nonnegative", x),你可以传入uint


在导出的函数或方法中,即使它已经被记录并可能被命名为MustXYZ(例如regexp.MustCompile),恐慌也是可以接受的。 - Volker

-1

我不确定使用断言来检查参数的基本属性是否符合语言的哲学。

如果参数确实可能具有无效值(例如在数据库中找不到),则应返回错误:

func doUsefulThings(s *Something) error {
      // return an error if your algorithm detect an invalid value

断言s不是nil只会增加冗余。验证你没有提供nil是没有意义的。

添加返回参数,特别是error,会强制所有用户检查此错误。不要在函数中编写代码来防御调用方代码中的微不足道的错误。在调用您的函数之前,调用方应该简单地测试它是否为nil如果可能的话,取决于其余的代码


1
它不会增加冗余,这是从包外部公开的函数应该遵循的正确方式。 - Sergey Kostrukov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接