功能覆盖

时间:2015-05-28 09:45:19

标签: function go

我在Go中发现了一些有趣的东西。假设我的包名是mypkg,在mypkg内,我有两个功能:

package mypkg
func MyFunc0(){
    //...
}
var MyFunc1 = func(){
    //...
}

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

mypkg.MyFunc1 = func(){
   // new logic
}

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

2 个答案:

答案 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_typeshttps://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)
    }
}

我为我的英语道歉。