Golang中使用Println打印字符串和函数返回值的方法

Golang中使用Println打印字符串和函数返回值的方法

package main

import (
	"fmt"
)


func main() {
	fmt.Println("random text",test(1,2))
}

func test(int,int) (int,int) {
	return 3, 4
}

我期望上述代码能产生以下结果:

random text 3 4

但我却得到了错误:

multiple-value test() in single-value context

如何获得预期的输出。

6 回复

看起来Johan的回答很完美。😊

更多关于Golang中使用Println打印字符串和函数返回值的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


仅能在打印语句中直接使用单返回值函数

fmt.Println(test(1,2))

运行完美,输出结果为:

3 4

那么为什么

fmt.Println("random text",test(1,2))

会失败?

我从未单独使用过带函数的打印语句(总是会附带一些字符串信息)。我一直习惯用我提到的那种方式。

你说得对。我也尝试了其他返回类型,结果都一样。这背后肯定有某种原因。让我们看看其他人怎么说。可能是一些显而易见的东西。

既然你是专家!

你好 Rahul,

test 函数返回两个整数值 - 3 和 4

因此,

package main

import (
	"fmt"
)


func main() {
    a, b := test(1,2)
	fmt.Println("random text", a, b)
}

func test(int,int) (int,int) {
	return 3, 4
}

这样是可行的。你可以在打印语句中直接使用仅返回单个值的函数。虽然还有其他更复杂的方法来实现这一点,但目前这是最简单的方式。

Go语言规范:调用

作为特例,如果函数或方法g的返回值数量与另一个函数或方法f的参数数量相等,且每个返回值都能分别赋值给f的参数,那么调用表达式f(g(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")
}

因此,允许使用具有多个返回值的函数作为唯一参数来调用函数。

问题在于fmt.Println函数期望接收一系列参数,但test函数返回的是两个值。在Go语言中,当函数返回多个值时,不能直接在需要单个值的地方使用它,除非将多个返回值分别传递给函数。

要解决这个问题,您可以将test函数的返回值作为单独的参数传递给fmt.Println。以下是修正后的代码示例:

package main

import (
	"fmt"
)

func main() {
    a, b := test(1, 2)
    fmt.Println("random text", a, b)
}

func test(int, int) (int, int) {
    return 3, 4
}

或者,您也可以直接在fmt.Println中调用函数并将返回值作为单独的参数传递:

package main

import (
	"fmt"
)

func main() {
    fmt.Println("random text", test(1, 2))
}

func test(int, int) (int, int) {
    return 3, 4
}

在第二个示例中,test(1, 2)返回的两个值会被自动展开为fmt.Println的两个单独参数,因此不会出现"multiple-value in single-value context"错误。输出结果将是:

random text 3 4

这利用了Go语言中函数调用时多返回值的自动展开特性。

回到顶部