【问题标题】:How to check function parameters in Go如何在 Go 中检查函数参数
【发布时间】:2012-09-24 15:35:36
【问题描述】:

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

【问题讨论】:

    标签: java validation go guava preconditions


    【解决方案1】:

    这取决于上下文。

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

    如果没有导出,调用不正确会是程序员的错误,我觉得panic(errors.New("bla bla bla"))是合理的。虽然一旦你取消引用该指针,函数就会恐慌,无论如何。

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

    【讨论】:

    • 在导出的函数或方法中甚至可以出现恐慌,特别是如果它被记录并可能命名为 MustXYZ 参见例如regexp.MustCompile (golang.org/pkg/regexp/#MustCompile)
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 它不会增加冗长,对于从包外部暴露的函数来说,这是正确的方法。
    猜你喜欢
    • 2017-01-27
    • 2014-01-14
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2021-03-01
    • 2012-12-26
    相关资源
    最近更新 更多