我在Go中发现了一些有趣的东西。假设我的包名是mypkg
,在mypkg
内,我有两个功能:
package mypkg
func MyFunc0(){
//...
}
var MyFunc1 = func(){
//...
}
现在在我的main
包中,可以覆盖MyFunc1
,如下所示:
mypkg.MyFunc1 = func(){
// new logic
}
但是,无法以相同的方式覆盖MyFunc0
。所以现在提出一个问题。声明函数的两种方式有什么区别?这种行为是否有意?
答案 0 :(得分:5)
MyFunc0
是一个函数声明(https://golang.org/ref/spec#Function_declarations)
MyFunc1
不是函数声明。它是func类型的变量(https://golang.org/ref/spec#Variable_declarations)(请参阅https://golang.org/ref/spec#Function_types,https://golang.org/ref/spec#Function_literals)。它有一个初始值,但可以更改为保持不同的值/函数(只要函数签名匹配)。
答案 1 :(得分:0)
我学习语言(和英语:P),并且在游览中是一个exersie:Fibonacci关闭
(https://tour.golang.org/moretypes/22)
结果是: 0 1 1 2 3 五 8 13 21 34
主要功能是:
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
我的第一个解决方案是:
func fibonacci() func() int {
antant := 0
ant := 1
i := 0
return func() int {
var result int
if i == 0 || i == 1 {
result = i
i++
return result
}
result = antant + ant
antant = ant
ant = result
return result
}
}
但是如果是第一次或第二次通话(if i == 0 || i == 1
),我不想在呼叫f()时询问。结果是一个函数自动覆盖:
type doFibonacci func(*doFibonacci) int
func fibonacci() func() int {
antant := 0
ant := 1
i := 0
doFibo := doFibonacci(func(ptrDo *doFibonacci) int {
var result int
if i == 0 || i == 1 {
result = i
i++
return result
}
*ptrDo = func(ptrDo *doFibonacci) int {
var result int
result = antant + ant
antant = ant
ant = result
return result
}
return (*ptrDo)(ptrDo)
})
return func() int {
return doFibo(&doFibo)
}
}
我为我的英语道歉。