[已解决]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
哈哈,没问题,我们都在学习!!!
更多关于[已解决]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.Printf和fmt.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的类型系统不允许这种不匹配。

