Yeni bir kullanıcıyım ve bu sorunla neredeyse tüm gün mücadele ediyordum. olarak bu işleyici işlevi geçmekarabirimi {} işlev türüne dönüştürebilme
typedHandler = func() {
fmt.Println("in a handler!\n")
}
Ama neye yapmam gereken: Ben typedObject böyle değişkene bir fonksiyon atayabilirsiniz
type HandlerType func()
var object interface{}
var typedObject HandlerType
:
düşünüldüğünde de bunlar var Bir arabirim {} değişkeni ve sonra bir şekilde daha sonra arayabileceğim HandlerType'a dönüştürüyorum.
Denedim ama
interface conversion: interface is func(), not main.HandlerType
Temelde ben kayıt olmadan önce ek tip dönüşümü olmaksızın farklı imzalara sahip fonksiyonlarını kaydetmeniz gerekir: içinde
typedHandler = object.(HandlerType)
sonuçları: o hata verir. Bunun yerine bunu yapmanın:
registerHandler(HandlerTypeString(func() string { ... }))
registerHandler(HandlerTypeVoid(func() { ... }))
böyle işleyicileri kaydetmek istediğiniz:
registerHandler(func() string { ... })
registerHandler(func() { ... })
.. ve ben daha sonra bir işleyici çağrısının zaman
de yansımasını dahil etmek istemiyoruzMümkün mü?
Düzenleme: Ben arayüzünde {} gibi bazı keyfi fonksiyonunu geçmek ve sonra bir şekilde HandlerType veya başka önceden tanımlanmış dönüştürmek için bir yolu yoktur anladığım kadarıyla http://play.golang.org/p/UlwqkHjt_P
: Ben bir oyun alanı oluşturduk işlev türü bu yüzden yansıma kullanmadan arayabilir miyim?
Edit2
: Bu çözüm geldi ettik: http://play.golang.org/p/4gUxsgmiPfbu kodla çalışma zamanı sırasında herhangi bir performans ceza yoktur olmamalıdır. Ama birisi arabirimi {} arabirimi olmadan bu işlevselliği gerçekleştirmenin başka bir yolunu düşünebilir mi?
göster tam kod nasıl yapılacağına ilişkin orada bir örnek vardır reflect.MakeFunc ile artık bunu yapabilirsiniz. 'typedHandler = nesne. (HandlerType)' ** ** nesne ('' interface {} 'türünde) gerçekten' HandlerType' nesnesini içeriyorsa çalışacaktır. Oyun alanında oynanabilir kodu göster. – Volker
Bir tane daha: Eğer Yeni Başlayan iseniz, arayüzden {} 'kaçınmalısınız. Finde başka bir yol, yazar uygun Go kodu. 'Interface {} 'adlı sihirbaz, başka bir dilden kod çevirisi gibi kokuyor. – Volker
Ben neyi başarmak istediğimi açık yaptığımı düşündüğüm bir oyun alanı ekledim :) – user3668351