[已解决]Golang中多返回值函数在单值上下文中的问题 - fmt.Println可用但fmt.Printf不可用

[已解决]Golang中多返回值函数在单值上下文中的问题 - fmt.Println可用但fmt.Printf不可用 各位Gopher们好,

我查阅过讨论这个问题的帖子,但说实话反而更困惑了。 我并非开发人员,只是个正在学习Go语言的新手,如果发现任何错误或愚蠢之处还请见谅。

以下是我正在尝试实现的代码:

package main

import "fmt"

func main() {
	/*
		fmt.Println("vim-go")
		fmt.Println(addNavg(50, 50)) //这个可以正常工作
	*/
	fmt.Printf("%f\n", addNavg(50.0, 50.0)) //这个无法工作
	fmt.Printf("%f %f\n", addNavg(50.0, 50.0)) //这个也无法工作
}

func addNavg(num1 float64, num2 float64) (float64, float64) {
	num3 := num1 + num2
	num4 := (num1 + num2) / 2
	return num3, num4
}

当我使用fmt.Println时一切正常,但使用fmt.Printf时就会报错:

#command-line-arguments
./main.go:10:31: multiple-value addNavg() in single-value context

我查阅了现有帖子,发现第一个帖子的楼主遇到的是fmt.Println的问题,而我的问题却出现在fmt.Printf上。我到底哪里理解错了/犯了什么低级错误?


更多关于[已解决]Golang中多返回值函数在单值上下文中的问题 - fmt.Println可用但fmt.Printf不可用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

哈哈,没问题,我们都在学习!!!

更多关于[已解决]Golang中多返回值函数在单值上下文中的问题 - fmt.Println可用但fmt.Printf不可用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


只需使用临时变量

a, b := addNavg(50.0, 50.0)
fmt.Printf("%f %f\n", a, b)

一步一个脚印,不要灰心,永不放弃!!! 😃

嗨 Yamil,
成功了!!为什么我这个笨脑袋没想到这个方法,我自己也搞不懂。我最糟糕的问题是,虽然我理解错误信息的字面意思,但不知道如何修复它。这种情况以前从未发生过。我之前接触过 Perl 和一点 Python,都能解决错误。希望有一天我能掌握这个技巧。😊

是的,只是我对自己的学习速度不太满意(确切地说是觉得不够快)。我学习Golang是因为它能生成单一可执行文件。在我工作的地方,公司网络限制相当严格……所以在生产服务器上我既不能安装模块,也不能安装不同版本的Python来运行我的脚本。我并没有尝试什么复杂的功能,只是通过SSH连接到主机获取输出并进行过滤、邮件发送等操作,但无法安装诸如paramiko之类的库。不允许使用pip安装。😦

另外还有一个原因是,如果简历上有Golang经验,我可能会在同类职位(存储顾问)的竞争者中获得一些优势。

我原本已经准备好在这里被说"去读手册吧",甚至可能被怼"Golang不适合你这种笨蛋,赶紧滚蛋",但幸好这种情况(暂时)还没有发生。😊

这是因为fmt.Printffmt.Println在处理多返回值函数时有本质区别。

fmt.Println可以接受任意数量的参数,它会自动处理多返回值函数的所有返回值。而fmt.Printf需要严格匹配格式说明符的数量和参数的数量。

在你的代码中,addNavg()函数返回两个float64值,但你的fmt.Printf调用只提供了一个格式说明符%f,这导致了"multiple-value in single-value context"错误。

解决方案:

package main

import "fmt"

func main() {
    // 正确用法1:接收两个返回值,分别使用
    sum, avg := addNavg(50.0, 50.0)
    fmt.Printf("Sum: %f, Average: %f\n", sum, avg)
    
    // 正确用法2:使用下划线忽略不需要的返回值
    sumOnly, _ := addNavg(50.0, 50.0)
    fmt.Printf("Sum only: %f\n", sumOnly)
    
    // 正确用法3:直接传递两个返回值给Printf
    fmt.Printf("%f %f\n", addNavg(50.0, 50.0))
}

func addNavg(num1 float64, num2 float64) (float64, float64) {
    num3 := num1 + num2
    num4 := (num1 + num2) / 2
    return num3, num4
}

关键区别示例:

// fmt.Println - 自动展开所有返回值
fmt.Println(addNavg(50.0, 50.0)) // 输出: 100 50

// fmt.Printf - 需要明确指定每个返回值
fmt.Printf("%f %f\n", addNavg(50.0, 50.0)) // 输出: 100.000000 50.000000

// 错误的用法 - 格式说明符数量不匹配
fmt.Printf("%f\n", addNavg(50.0, 50.0)) // 编译错误

你的代码无法工作的原因是fmt.Printf("%f\n", addNavg(50.0, 50.0))试图将两个返回值塞进一个格式说明符中,而Go的类型系统不允许这种不匹配。

回到顶部