【问题标题】:What's the difference between these two variants?这两种变体有什么区别?
【发布时间】:2017-05-02 13:53:42
【问题描述】:

我尝试编写自己的代码来学习如何在主函数中返回多个值:

package main

import "fmt"

func main() {
    fmt.Println("Enter a integer:")
    var I int
    fmt.Scanf("%d", &I)
    fmt.Println("Accepted:", I)

    O := half(I)
    fmt.Println("Returned:", O)
}

func half(N int) (int, bool) {
    var NA int
    NA = N / 2
    if NA%2 == 0 {
        fmt.Println("even")
        return NA, true
    } else {
        fmt.Println("odd")
        return NA, false
    }
}

并给出错误:half.go|11| multiple-value half() in single-value context。 然而,另一个变体正在工作:

package main

import (
    "fmt"
)

func half(number int) (int, bool) {
    if x := int(number % 2); x == 0 {
        return x, true
    } else {
        return x, false
    }
}

func main() {
    fmt.Println(half(1))
    fmt.Println(half(2))
}

我做错了什么?如何克服我的错误?

【问题讨论】:

    标签: go multiple-value


    【解决方案1】:

    如果一个函数有 2 个返回值,你必须“期待”这两个或根本没有。更多信息:Return map like 'ok' in Golang on normal functions

    您的 half() 函数有 2 个返回值,因此当使用 short variable declaration 将返回值存储在变量中时,您必须提供 2 个变量:

    O, even := half(I)
    fmt.Println("Returned:", O, even)
    

    在第二种情况下,您没有存储返回的值,而是将它们传递给具有签名的fmt.Println()

    func Println(a ...interface{}) (n int, err error)
    

    fmt.Println() 有一个可变参数,因此您可以向它传递任意数量的参数。这里发生的是half() 的所有多个返回值作为Println() 的可变参数的值传递。 Spec: Calls:

    中允许并详细说明了这一点

    作为一种特殊情况,如果函数或方法g 的返回值数量相等并且可以单独分配给另一个函数或方法f 的参数,则调用f(g(parameters_of_g)) 将调用fg的返回值依次绑定到f的参数后。 f的调用除了g的调用外,不能包含任何参数,g必须至少有一个返回值。如果f 有一个最终的... 参数,则为其分配g 的返回值,这些返回值在分配常规参数后仍然存在。

    注意,这样做时,你不能传递/提供额外的参数,所以例如下面也是一个编译时错误

    fmt.Println("Returned:", half(10))
    // Error: multiple-value half() in single-value context
    

    看看这些类似的问题:

    Go: multiple value in single-value context

    Avoid nesting from conjunction with function that returns 2 values in go?

    【讨论】:

      【解决方案2】:

      fmt.Println 接受任意数量的参数,因此可以接受 half 的结果。

      在第一个中,您需要为这两个变量提供位置。要么:

      i,b := half(2)

      i, _ := half(2)

      如果您不需要第二次退货。

      【讨论】:

        猜你喜欢
        • 2013-09-08
        • 2019-12-11
        • 2019-03-31
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多