登录
首页 >  Golang >  Go问答

如何将多个返回值传递给可变参数函数?

来源:Golang技术栈

时间:2023-04-13 15:33:55 346浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《如何将多个返回值传递给可变参数函数?》将会介绍到golang等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我有一个返回两个整数值的 Go 函数。下面是函数

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

是否可以将temp函数直接放入 aPrintln并使用字符串格式打印两个输出,如下所示:

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

在 Python 中,我可以执行以下操作:

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

我也可以在 Go 中做类似的事情吗?

正确答案

前言: 我在 中发布了这个实用程序github.com/icza/gox,请参阅gox.Wrap()


首先,对于您尝试做的事情,您应该使用fmt.Printf()而不是fmt.Println()仅像前者所期望的那样使用格式字符串。

展望未来,默认情况下不支持此功能,因为引用Spec: Calls:

作为一种特殊情况,如果一个函数或方法的返回值g数量相等并且可以单独分配给另一个函数或方法的参数f,则调用f(g(parameters_of_g))f在将返回值按顺序绑定g到参数后调用。 的调用 不能包含除 的调用以外的任何参数 ,并且 必须至少有一个返回值。 如果有最终参数,则为其分配常规参数分配后剩余的返回值。f f``g``gf``...``g

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有一个最终参数,它被分配了在分配后剩余...的返回值g常规参数。”

但是通过一个小技巧,我们也可以实现您想要的fmt.Printf()

请注意,如果temp()将返回一个 type 的值[]interface{},我们可以使用...它作为一些可变参数的值传递。

这意味着这有效:

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

func temp() []interface{} { return []interface{}{1, 2} }

它可以正确打印(在Go Playground上尝试):

1: 1, 2: 2

所以我们只需要一个实用函数,将任何函数的返回值包装到 a[]interface{}中,这样我们就可以使用它来传递给fmt.Printf().

这非常简单:

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

如上所述(使用fmt.Println()),我们可以将具有至少 1 个返回值的任何函数的返回值wrap()作为其输入参数的值传递。

现在使用这个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

有关该主题的更多信息,请参阅相关问题:

[单值上下文中的多个值](https://stackoverflow.com/questions/28227095/multiple-values-in- single-value-context/28233172#28233172)

[在普通函数上返回像 Golang 中的 'ok' 之类的映射](https://stackoverflow.com/questions/28487036/return-map-like-ok-in- golang-on-normal-functions/28487270#28487270)

本篇关于《如何将多个返回值传递给可变参数函数?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>