Golang中如何在另一个函数内扩展匿名函数
Golang中如何在另一个函数内扩展匿名函数
package main
import "fmt"
func main(){
fmt.Println(func(){fmt.Println("hello world");}());
}
我期望看到
hello world
但却得到了以下错误
# command-line-arguments
./5.go:6: (func literal)() used as value
为什么没有打印"hello world"呢?
9 回复
我还没有学习接口的相关知识,但根据这个说法,我的理解是:return 语句本身就是一个接口吗?
更多关于Golang中如何在另一个函数内扩展匿名函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我建议您学习一下Go语言之旅?这是学习Go语言基础知识的绝佳途径。
谢谢,我会开始阅读的,但在结束对话前还有一个问题:return 关键字是一个接口吗?
是的,我修改了它,我以为我改进了它,但不明白为什么变得更糟了…
之前是
fmt.Println(func(){return "hello world";}());
现在,正如你在问题中看到的那样。
为什么当前这行代码没有意义?
我感觉你修改了你的问题。现在的问题与我回答时的情况大不相同。请不要这样做。
你目前的问题毫无意义。你期望什么?fmt.Println 不能仅接受一个 func 作为参数。
fmt.Println
fmt.Println 具有以下签名:
func Println(a ...interface{}) (n int, err error)
这意味着它可以接受任意数量的参数,这些参数可以实现任何接口。在此处不能使用 func 函数。
你的匿名函数没有返回任何内容。试试这个:
package main
import "fmt"
func main() {
fmt.Println(func() string { return "hello world" }())
}
问题在于匿名函数的调用方式和返回值处理。在您的代码中,匿名函数没有返回值,但fmt.Println()期望接收一个值来打印。
以下是正确的解决方案:
方案1:直接在匿名函数内打印
package main
import "fmt"
func main() {
func() {
fmt.Println("hello world")
}() // 直接调用匿名函数
}
方案2:让匿名函数返回字符串
package main
import "fmt"
func main() {
result := func() string {
return "hello world"
}()
fmt.Println(result)
}
方案3:使用函数值(如果需要在多个地方调用)
package main
import "fmt"
func main() {
printHello := func() {
fmt.Println("hello world")
}
printHello() // 调用函数值
}
错误原因分析:
func(){fmt.Println("hello world");}()这个表达式本身没有返回值fmt.Println()需要一个具体的值作为参数- 当匿名函数执行
fmt.Println("hello world")时,它打印了内容,但返回的是(n int, err error),这不符合fmt.Println的参数要求
第一个方案是最接近您原始意图的修正版本。


