在Golang中,我可以将切片值指定为返回值吗?

时间:2014-08-08 17:09:08

标签: go return-value variable-assignment slice idioms

我正在尝试开发一个passthrough函数来进行错误检查,其中评估某些参数,然后返回其余参数。但我希望这些作为多个返回值而不是切片返回。在Go中有什么办法吗?这是一个例子:

func Check(args ...interface{}) ...interface{} {
    last := len(args) - 1
    err := args[last]

    // Check for an error in the last argument
    if err != nil {
        panic(err)
    }

    // Return any args returned by the function we're checking
    return ...args[:last]
}

我知道这在函数声明中并没有完全形成。这只是为了争论。理想情况下,我希望能够返回可变数量的值,然后可以通过赋值在另一侧接收。当我想使用标准的错误/恐慌习惯时,这将允许简单的内联错误检查。

我知道我可以返回切片然后将其分配给各个变量,或者我可以创建多个这样的函数(例如Check0,Check1,Check2等),每个函数都有不同的数字或者返回值,但这些解决方案都不是很优雅。关于如何使这样的东西优雅地工作的任何想法?或者在Go的这个阶段是不可能的?

在相关的说明中,是否有人知道是否有计划将切片解包为变量,如下所示?

one, two, three := []string{"one", "two", "three"}

1 个答案:

答案 0 :(得分:1)

你不能这样做,我认为这甚至没有计划,这对IMO来说是件好事。

您的选择是做这样的事情(这很难看,不应该使用):

func Check(args ...interface{}) []interface{} {
    if err := args[len(args)-1]; err != nil {
        //do suff with err
    }
    args = args[:len(args)-1]
    return args
}

func Check2i(args ...interface{}) (int, int) {
    return args[0].(int), args[1].(int)
}

func main() {
    fmt.Println(Check(10, 20, 30, nil)...)
    a, b := Check2i(Check(10, 20, nil)...)
    _, _ = a, b
}