反射:透過字串存取結構
考慮一個場景,其中您有一個具有特定方法的結構:
type MyStruct struct { } func (a *MyStruct) AAction() { fmt.Println("Hello a") }
要使用反射動態呼叫AAction方法,可以執行以下操作(有效method):
reflect.New(reflect.TypeOf(MyStruct{})).MethodByName("AAction").Call([]reflect.Value{})
但是,使用 MyStruct{} 作為表達式並不是您想要的方法。相反,您希望將結構名稱指定為字串。這種方法目前無法存取:
theStruct := "MyStruct" theAction := "AAction" reflect.New(reflect.TypeOf(theStruct)).MethodByName(theAction).Call([]reflect.Value{})
不幸的是,這種嘗試是有缺陷的,因為 Reflect.TypeOf(theStruct) 將產生字串類型。
根據您的研究,您遇到了類似的情況關於使用字串按名稱呼叫結構方法的問題。然而,建議的字串匹配方法並不是一個可行的解決方案。
答案:
儘管您有這樣的願望,但不可能調用僅使用表示結構名稱的字串的結構方法。這是正確的,因為反射需要相關類型的特定值才能進行操作。如果沒有值,就無法與結構或其方法互動。
要實現所需的功能,您需要維護一個自訂註冊表,將結構名稱對應到對應的類型。此註冊表允許您根據字串名稱檢索類型,然後像往常一樣使用反射。然而,這種方法需要額外的努力,並且可能不適合所有場景。
以上是Go 中的 struct 方法可以透過反射僅使用其字串名稱來呼叫嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!