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


不,return 是一个语句。你可以在规范中阅读所有相关细节:https://golang.org/ref/spec#Return_statements

我建议您学习一下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" }())
}

https://play.golang.com/p/SfDB3B2ISiU

问题在于匿名函数的调用方式和返回值处理。在您的代码中,匿名函数没有返回值,但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的参数要求

第一个方案是最接近您原始意图的修正版本。

回到顶部