Golang闭包函数用法示例

Golang闭包函数用法示例

package main

import (
	"fmt"
)

type test struct {
	name string
	fn   func() string
}

var d = []test{{
	"Google",
	func() string {
		str := read()
		return str
	}}}

func read() string {

	str := "golang"

	return str
}

func main() {

	for i := 0; i < len(d); i++ {

		name := d[i].name

		lang := d[i].fn

		fmt.Println(name, lang)
	}
}

请告诉我为什么我没有得到预期的语言输出:- 输出:- Google 0x483280 期望输出:- Google golang 这是我需要的


更多关于Golang闭包函数用法示例的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

谢谢

更多关于Golang闭包函数用法示例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢,

调用函数,而不仅仅是打印它:

fmt.Println(name, lang())

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

在你的结构体中,fn 只是一个返回字符串的函数,所以你实际执行的是:

var fn = func() string{return "google"}
print(fn)

因此正确的做法是:

var fn = func() string{return "google"}
var s = fn()
print(s)

问题在于您没有调用闭包函数。在代码中,d[i].fn 是一个函数类型的变量,直接打印它会显示函数的内存地址而不是执行函数的结果。

要获得预期的输出,您需要调用这个函数:d[i].fn()

以下是修正后的代码:

package main

import (
	"fmt"
)

type test struct {
	name string
	fn   func() string
}

var d = []test{{
	"Google",
	func() string {
		str := read()
		return str
	}}}

func read() string {
	str := "golang"
	return str
}

func main() {
	for i := 0; i < len(d); i++ {
		name := d[i].name
		lang := d[i].fn()  // 调用函数获取返回值
		
		fmt.Println(name, lang)
	}
}

输出:

Google golang

关键区别在于:

  • 原代码:lang := d[i].fn - 这获取的是函数本身
  • 修正后:lang := d[i].fn() - 这调用函数并获取其返回值

在Go语言中,函数是一等公民,可以作为值传递和存储。当您需要执行函数并获取结果时,必须使用括号 () 来调用它。

回到顶部