代码之家  ›  专栏  ›  技术社区  ›  rawwar

如何解析golang中的多重返回

  •  2
  • rawwar  · 技术社区  · 6 年前

    func temp() (int, int){
     return 1,1
    }
    

    有没有可能 temp Println 并使用字符串格式打印两个输出,如下所示:

    fmt.Println("first= %d and second = %d", temp() ) // This doesn't work
    

    def func():
        return 1,1
    print("{0}={1}".format(*func())
    >> '1=2'
    

    我也可以在围棋中做类似的动作吗?

    3 回复  |  直到 6 年前
        1
  •  6
  •   icza    5 年前

    前言: 我在年发布了这个工具 github.com/icza/gox ,请参见 gox.Wrap() .


    首先,对于你试图做的事情,你应该使用 fmt.Printf() 而不是 fmt.Println()

    接下来,这在默认情况下不受支持,因为引用 Spec: Calls:

    作为特例,如果函数或方法的返回值 g f ,然后呼叫 f(g(parameters_of_g)) 将调用 f 在绑定 的参数 f 上帝的召唤 f 只能包含的调用以外的参数 ,和 必须至少有一个返回值。 如果 f 有期末考试 ... 参数的返回值

    以及 fmt.Printf() 签名:

    func Printf(format string, a ...interface{}) (n int, err error)
    

    不能将其他参数传递给 fmt.Printf() 除了函数调用(调用的返回值)。

    fmt.Println()

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

    也就是说 fmt.Println(temp()) 对至少有一个返回值的任何其他函数都有效,因为引用部分的最后一句允许这样做( f 有期末考试 参数的返回值 在分配常规参数后仍保留的。” )

    但只要耍点小把戏,我们就能达到你想要的效果 我也是。

    注意,如果 temp() 将返回类型为的值 []interface{} ...

    这意味着:

    func main() {
        fmt.Printf("1: %v, 2: %v\n", temp()...)
    }
    
    func temp() []interface{} { return []interface{}{1, 2} }
    

    正确打印(在电脑上试试) Go Playground ):

    1: 1, 2: 2
    

    所以我们只需要一个实用函数,将任何函数的返回值包装成 ,所以我们可以用这个传递给 .

    很简单:

    func wrap(vs ...interface{}) []interface{} {
        return vs
    }
    

    如上所述(带有 fmt.Println() ),我们可以将至少有1个返回值的任何函数的返回值传递给 wrap()

    现在用这个 包装() 函数,请参见以下示例:

    func main() {
        fmt.Printf("1: %v\n", wrap(oneInt())...)
        fmt.Printf("1: %v, 2: %v\n", wrap(twoInts())...)
        fmt.Printf("1: %v, 2: %v, 3: %v\n", wrap(threeStrings())...)
    }
    
    func oneInt() int { return 1 }
    
    func twoInts() (int, int) { return 1, 2 }
    
    func threeStrings() (string, string, string) { return "1", "2", "3" }
    

    Go Playground ):

    1: 1
    1: 1, 2: 2
    1: 1, 2: 2, 3: 3
    

    Multiple values in single-value context

    Return map like 'ok' in Golang on normal functions

        2
  •  6
  •   maerics    6 年前

    不,这是不可能的。必须将多值表达式中的所有值赋给单独的变量才能使用它们,例如:

    a, b := temp()
    fmt.Println("first = %d and second = %d", a, b)
    // first = 1 and second = 1
    

    有趣的是,在某些情况下,如果参数类型和arity匹配,或者对于纯可变函数,则可以使用多值表达式作为函数调用参数( Go Playground ):

    func oneTwo() (int, int) {
      return 1, 2
    }
    
    func incr2(x, y int) (int, int) {
      return x + 1, y + 1
    }
    
    func main() {
      incr2(oneTwo()) // OK: multi-value return and arguments match.
    
      fmt.Println(oneTwo()) // OK: pure variadic function.
    
      fmt.Printf("%d %d", oneTwo()) // ERR: mixed formal and variadic args.
    }
    
        3
  •  0
  •   rawwar    6 年前

    我能够打印它时,我没有使用任何字符串格式如下

    fmt.Println(temp())
    

    Println ,但不是 printf