最近在阅读Kubernetes早期版本的源码,发现var *** func()
的写法,请问这种写法该如何理解?有什么好处吗?
var testHookServerServe func(*Server, net.Listener) // used if non-nil
func (srv *Server) Serve(l net.Listener) error {
defer l.Close()
if fn := testHookServerServe; fn != nil {
fn(srv, l)
}
...
}
有疑问加站长微信联系(非本文作者)

你就理解为 func 是一个类型,比如,把 func 当做 string,就理解了。Go中 func 是第一公民
可是func没有指明对参数的具体处理,最后的fn(srv, l)算是什么呢?既没有处理,也没有返回,就只传了两个参数吗?
func 规定了一个方法签名,任何符合这个签名的 func 都可以赋值给它,具体的 func 会有方法体。这里 fn(srv, l) 就是函数调用啊。这里的代码,肯定有一处会给 testHookServerServe 这个变量赋值。
嗯,明白了,非常感谢!
类似与js里面的function 你写过js的话应该知道js也可以这么传function。。。。 原理一样
@polaris 我看了看代码,代码中并没有类似
testHookServerServe := xxx
这样的赋值发生啊,那请问fn := testHookServerServe
具体的值又是从哪来的呢?我也是初学者非常疑惑,所以请见谅~~我刚查了下最新版本的代码,里面没有
testHookServerServe
了,请提供你看的 Kubernetes 代码版本额,不好意思我是在 go 语言的标准 net/http/server.go 里看到的相同代码,不过真的是完全一样~
这个其中代码的部分截取,我用文本查找确定了只有这两块代码出现过
testHookServerServe
:我大概看了下,这个变量只是为了测试使用的(为测试留的钩子),而且代码注释很清晰:used if non-nil,所以,只有在测试代码中有。
http://docs.studygolang.com/src/net/http/export_test.go?s=1568:1590#L58
具体调用 SetTestHookServerServe 的,在 net/http/serve_test.go 中。
哦!十分感谢!!!看来这个问题是我对 go 的作用域理解还不够造成的!