4

Guava Preconditions allow to check method parameters in Java easily.

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());
    // ...
}

These check methods raise exceptions if the conditions are not met.

Go has no exceptions but indicates errors with return values. So I wonder how an idiomatic Go version of the above code would look like.

4

2 回答 2

2

这取决于上下文。

如果doUsefulThings是从包中导出的公共函数,则返回error. 您可以导出error可以返回的包级变量,调用者可以检查返回的变量是否error等于记录在案的搞砸方式之一。

如果没有导出,调用不正确会是程序员的错误,我认为panic(errors.New("bla bla bla")). 尽管无论如何,一旦取消引用该指针,该函数就会发生恐慌。

为此:checkArgument(x >= 0, "Argument was %s but expected nonnegative", x)您可以传入uint.

于 2012-09-24T15:49:25.620 回答
0

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

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

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

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

添加返回参数,特别是error强制所有用户检查这个错误。不要在你的函数中编写代码来防御调用者代码中的琐碎错误。调用者应该在调用你的函数之前简单地测试它不是nil如果这可能取决于代码的其余部分。

于 2012-09-24T15:49:18.117 回答