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

问题描述 投票:0回答:3

如果我有

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

我有:

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

然后我可以成功执行以下操作:

doSomething(returnIntAndString())

但是,假设我想添加另一个参数来执行以下操作:

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
分配给一些引用并传递消息和这些值,如
doSomething(msg, code, str)

go parameter-passing
3个回答
18
投票

在规范中对此进行了描述。它要求内部函数返回所有参数的正确类型。不允许使用额外的参数以及返回多个值的函数。

作为一种特殊情况,如果函数或方法 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
投票
我也有同样的问题。我能想到的最好的解决方案是为我想要的额外参数创建类型或结构,并为它们编写方法,如下所示:

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.
    

0
投票
我的解决方案是创建函数,返回一个接受额外参数的函数。

在此示例中,额外参数是一个函数。

func ValueAndErr(...) (V, error) { // ... return V, err // err may be nil } // What I wanted to do at first func GetValueAndDoSomethingIfErr[T any](v T, err error, callback func(error)) T { if err != nil { callback(err) } return v } // This does not compile :c // But I would have to assign output of the function ValueAndErr() to variables GetValueAndDoSomethingIfErr( ValueAndErr(...), func(err error) { ... }, ) func GetValueAndDoSomethingIfErr[T any](v T, err error) func(callback func(error)) T { return func(callback func(err error)) T { if err != nil { callback(err) } return v } } // This works :DD GetValueAndDoSomethingIfErr(ValueAndErr(...))(func(err error) { ... })
我不知道这个解决方案是否有效,或者是一个好的实践。不过它确实有效,而且我有点喜欢它。如有任何反馈,我们将不胜感激:D

© www.soinside.com 2019 - 2024. All rights reserved.