2017-08-03 18 views
1

有無論如何可以製作一個函數指針映射,但是帶有接收者的函數呢?我知道如何使用常規功能:Golang一個帶有接收器的函數圖

package main 

func someFunc(x int) int { 
    return x 
} 

func main() { 
    m := make(map[string]func(int)int, 0) 
    m["1"] = someFunc 
    print(m["1"](56)) 
} 

但是,你可以使用接收接收者的函數嗎?像這樣的東西(雖然我已經試過這一點,它不工作):

package main 

type someStruct struct { 
    x int 
} 

func (s someStruct) someFunc() int { 
    return s.x 
} 

func main() { 
    m := make(map[string](someStruct)func()int, 0) 
    s := someStruct{56} 
    m["1"] = someFunc 
    print(s.m["1"]()) 
} 

一個顯而易見的解決辦法是隻傳遞結構作爲參數,但這是髒一點比我本來

+1

否 - 方法不是自由浮動的功能,你可以」沒有關聯實例的方法的引用,並且不能針對不同的實例執行它。你可以用[反射](http://golang.org/pkg/reflect)來做到這一點。 – Adrian

+1

實際上,您可以爲沒有關聯實例的方法提供參考:https://golang.org/ref/spec#Method_expressions。以我的答案爲例。 – eugenioy

回答

3

可以做到這一點的方法使用表達式:

https://golang.org/ref/spec#Method_expressions

呼叫是有點不同的,由於該方法需要表達的接收機作爲第一個參數。

這裏是你的榜樣修改:

package main 

type someStruct struct { 
    x int 
} 

func (s someStruct) someFunc() int { 
    return s.x 
} 

func main() { 
    m := make(map[string]func(someStruct)int, 0) 
    s := someStruct{56} 
    m["1"] = (someStruct).someFunc 
    print(m["1"](s)) 
} 

而且這裏有一個圍棋操場爲你測試一下:

https://play.golang.org/p/PLi5A9of-U

+0

肯定是我在找的東西,謝謝 – Mauricio

相關問題