功能覆盖

Qia*_*hen 2 function go

我在Go找到了一些有趣的东西.假设我的包名是mypkg,在里面mypkg,我有两个功能:

package mypkg
func MyFunc0(){
    //...
}
var MyFunc1 = func(){
    //...
}
Run Code Online (Sandbox Code Playgroud)

现在在我的main包中,可以覆盖MyFunc1,如下所示:

mypkg.MyFunc1 = func(){
   // new logic
}
Run Code Online (Sandbox Code Playgroud)

但是,不可能以MyFunc0相同的方式覆盖.所以现在提出一个问题.声明函数的两种方式有什么区别?这种行为是否有意?

kos*_*tya 5

MyFunc0是函数声明(https://golang.org/ref/spec#Function_declarations)

MyFunc1不是函数声明.它是一个变量(https://golang.org/ref/spec#Variable_declarations型FUNC的)(见https://golang.org/ref/spec#Function_types,https://golang.org/ref/spec# Function_literals).它有一个初始值,但可以更改为保持不同的值/函数(只要函数签名匹配).

  • 静态函数可以以可变函数文字(即包含函数的变量)不能的方式进行优化.例如,可以内联静态函数.虽然Go绝对支持函数文字,但最好只在有特定目标时才使用它们.它不是"覆盖"超过"x = 1"是"覆盖"`x`.这是在Go中的任务.(在其他语言中,如ML,它*是*覆盖,但是`x = 1`也是*覆盖ML.) (3认同)
  • 除非你有充分的理由不应该总是使用函数声明(比如`MyFunc0`).它更容易阅读,它不能以令人惊讶的方式改变.说实话,我不确定是否有任何差异.我猜链接器将无法从生成的exe文件中删除var中的函数,即使它没有被使用. (2认同)