这段 go 代码始终理解不到

2024-03-13 17:27:51 +08:00
 Grocker
package main

import "fmt"

type Greeting func(name string) string

func (g Greeting) say(n string) {
	fmt.Println(g(n))
}

func english(name string) string {
	return "Hello, " + name
}

func main() {
	greet := Greeting(english)
	greet.say("World")
}

这段代码为什么会输出 Hello, World,始终理解不到

7584 次点击
所在节点    Go 编程语言
69 条回复
2kCS5c0b0ITXE5k2
2024-03-14 23:31:04 +08:00
类型别名
Subfire
2024-03-15 10:06:19 +08:00

greet := Greeting(english)
greet.say("World")
换成
var greet2 Greeting = english
greet2.say("World")
是不是更容易理解点了?
Jessec
2024-03-15 10:27:41 +08:00
我一开始也蒙,仔细观察发现这一行代码实际上是把 english 的类型转换成了 Greeting
greet := Greeting(english)
lilei2023
2024-03-15 14:25:23 +08:00
貌似就是转换了一下类型,然后把函数作为参数传进去了,前端不经常这么干么??
lilei2023
2024-03-15 14:28:18 +08:00
@lilei2023 更正一下,没传!看错了!
sunzhenyucn
2024-03-15 14:36:01 +08:00
这样写不是闲的吗?同事应该会打人吧(逃
sztink
2024-03-18 11:42:31 +08:00
@sunzhenyucn 很常见的一个技巧,经常用来将一个普通函数包裹成实现特定接口。比如上面就是 english 这个普通函数可以变成实现 say 方法的接口对象。Go 源码 net/http 里面有使用到 https://github.com/golang/go/blob/master/src/net/http/server.go#L2158-L2167 。包 robfig/cron 里面的 https://github.com/robfig/cron/blob/master/cron.go#L133-L154
sunzhenyucn
2024-03-21 16:59:02 +08:00
@sztink 学到了 谢谢
kenilalexandra
2024-04-04 22:14:23 +08:00
感觉并没有多难理解,Greeting 类型接收函数作为参数,say 函数由于是继承了 Greeting 的所有 greet 实际可以直接调用 say 函数不就完事了?难道说是你没理解函数也可以当作变量进行传递还是?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1023324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX