Golang返回函数的值作为另一个的输入参数

时间:2016-02-08 16:31:30

标签: go parameter-passing

如果我有

func returnIntAndString() (i int, s string) {...}

我有:

func doSomething(i int, s string) {...}

然后我可以成功完成以下任务:

doSomething(returnIntAndString())

然而,让我们说我想为doSomething添加另一个参数:

func doSomething(msg string, i int, s string) {...}

编译时抱怨,如果我称之为:

doSomething("message", returnIntAndString())

使用:

main.go:45: multiple-value returnIntAndString() in single-value context
main.go:45: not enough arguments in call to doSomething()

有没有办法做到这一点,或者我应该放弃并将returnIntAndString的返回值分配给某些引用并传递msg和doSomething(msg, code, str)这些值?

2 个答案:

答案 0 :(得分:10)

它描述了here in the spec。它需要内部函数为所有参数返回正确的类型。不允许额外的参数以及返回多个值的函数。

  

作为一种特殊情况,如果函数或方法g的返回值是   数量相等,可单独分配给参数   另一个函数或方法f,然后调用f(g(parameters_of_g))将   将g的返回值绑定到f的参数后调用f   为了。 f的调用必须不包含除调用之外的其他参数   g和g必须至少有一个返回值。如果f有最后的......   参数,它被赋予后面剩下的g的返回值   分配常规参数。

func Split(s string, pos int) (string, string) {
  return s[0:pos], s[pos:]
}

func Join(s, t string) string {
  return s + t
}

if Join(Split(value, len(value)/2)) != value {
  log.Panic("test fails")
}

如果不满足这些特定条件,则需要分配返回值并单独调用该函数。

答案 1 :(得分:0)

我也有同样的问题。我能想到的最佳解决方案是为我想要的额外参数创建类型或结构,并为它们编写方法,如下所示:

package main

import (
    "fmt"
)

type Message string

type MessageNumber struct {
    Message string
    Number int
}

func testfunc() (foo int, bar int) {
    foo = 4
    bar = 2
    return
}

func (baz Message) testfunc2(foo int, bar int) {
    fmt.Println(foo, bar, baz)
}

func (baz MessageNumber) testfunc3(foo int, bar int) {
    fmt.Println(foo, bar, baz.Number, baz.Message)
}

func main() {
    Message("the answer").testfunc2(testfunc())
    MessageNumber{"what were we talking about again?", 0}.testfunc3(testfunc())
    fmt.Println("Done.  Have a day.")
}

输出如下:

user@Frodos-Atari-MEGA-STE:~/go/test$ go run main.go
4 2 the answer
4 2 0 what were we talking about again?
Done.  Have a day.