【问题标题】:Return values of function as input arguments to another将函数的值作为输入参数返回给另一个
【发布时间】:2016-05-18 09:41:41
【问题描述】:

如果我有

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

我有:

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

那么我可以成功做到以下几点:

doSomething(returnIntAndString())

但是,假设我想为 doSomething 添加另一个参数,例如:

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

如果我这样称呼它,Go 在编译时会报错:

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)

【问题讨论】:

  • 如果您发布其余代码会很有帮助

标签: go parameter-passing


【解决方案1】:

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

作为一种特殊情况,如果函数或方法 g 的返回值是 数量相等且可单独分配给 另一个函数或方法 f,则调用 f(g(parameters_of_g)) 将 将 g 的返回值绑定到 f 的参数后调用 f 为了。 f 的调用必须不包含调用以外的参数 g 的值,并且 g 必须至少有一个返回值。如果 f 有一个final ... 参数,它被分配了之后剩余的 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")
}

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

【讨论】:

    【解决方案2】:

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

    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.
    

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多