我是一個Go新手,今天我幾乎整天都在和這個問題鬥爭。接口{}到函數類型轉換
考慮到我有這些:
type HandlerType func()
var object interface{}
var typedObject HandlerType
我可以功能分配給typedObject變量是這樣的:
typedHandler = func() {
fmt.Println("in a handler!\n")
}
但我需要做的是通過該處理程序功能一個接口{}變量,然後將其轉換爲HandlerType,我可以稍後調用
我試過這個,但它引發錯誤:
typedHandler = object.(HandlerType)
結果:
interface conversion: interface is func(), not main.HandlerType
基本上我需要無需額外的類型轉換註冊之前註冊到不同的簽名功能。因此,而不是這樣做:
registerHandler(HandlerTypeString(func() string { ... }))
registerHandler(HandlerTypeVoid(func() { ... }))
我要註冊的處理程序是這樣的:
registerHandler(func() string { ... })
registerHandler(func() { ... })
..我不想在處理程序調用的之後的時刻
涉及反射這可能嗎?
編輯:我創建了一個遊樂場:http://play.golang.org/p/UlwqkHjt_P
所以據我所知是沒有辦法通過一些任意的功能接口{}然後以某種方式將其轉換爲HandlerType或其他一些預定義函數類型,所以我可以在不使用反射的情況下調用它?
EDIT2:我想出了這個解決方案:http://play.golang.org/p/4gUxsgmiPf
不應該有這種代碼在運行時的任何性能損失。但有人可以想出另一種實現這種功能的方式,而不需要interface {}?
顯示完整代碼中有一個例子。 'typedHandler = object。(HandlerType)**如果object(類型爲'interface {}')真的包含一個HandlerType對象,**將會工作。顯示在操場上播放的代碼。 – Volker
另外一個:如果你是一個Go newcommer,你應該避免'interface {}'。 Finde以其他方式,作家適當的Go代碼。一個用於'interface'魔法的新手聞起來像是其他語言的代碼音譯。 – Volker
我已經添加了一個操場,我想我已經明確了我想要完成什麼:) – user3668351