为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
30秒到达战场 2021-12-07 19:35:45
如果我有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 contextmain.go:45: not enough arguments in call to doSomething()有没有办法做到这一点,或者我应该放弃并将返回值分配returnIntAndString给某些引用并传递 msg 和这些值,例如doSomething(msg, code, str)?
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

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


作为一种特殊情况,如果函数或方法 g 的返回值在数量上相等并且可以单独分配给另一个函数或方法 f 的参数,那么调用 f(g(parameters_of_g)) 将在绑定返回值后调用 f g 到 f 的参数的顺序。除了 g 的调用外,f 的调用不能包含任何参数,并且 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")

}

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


查看完整回答
反对 回复 2021-12-07
?
莫回无

TA贡献1865条经验 获得超7个赞

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


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-12-07
  • 2 回答
  • 0 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信