我正在嘗試基于字符串動態創建結構。在下面的示例中,reflect.TypeOf &c 和 &c1 是不同的,因為我從 makeInstance 返回了 interface{}。TypeOf c 和 c1 是一樣的。我的問題是如何更改處理 makeInstance 輸出的方式,以便它創建一個與 c1 相同的對象,但仍然允許我創建與 b1 相同的對象?type Car struct { Make int `json:"make"` Model int `json:"model"`}type Bus struct { Seats int `json:"seats"` Route int `json:"route"`}var typeRegistry = make(map[string]reflect.Type)func init() { typeRegistry["Car"] = reflect.TypeOf(Car{}) typeRegistry["Bus"] = reflect.TypeOf(Bus{})}func makeInstance(name string) interface{} { v := reflect.New(typeRegistry[name]).Elem() return v.Interface()}func main() { c := makeInstance("Car") b := makeInstance("Bus") var b1 Bus var c1 Car fmt.Println(reflect.TypeOf(&c)) fmt.Println(reflect.TypeOf(&c1)) fmt.Println(reflect.TypeOf(c)) fmt.Println(reflect.TypeOf(c1))編輯:我的總體結果是有一個程序讀取一個 json 配置文件,該文件將列出我想要關閉的對象類型并點擊 rest api 并收集例如{ "auth":[{ "username": "admin", "password": "admin" }], "transport":[ { "vehicle":["car", "bus"] }]}當循環通過車輛時,它會點擊一個 api 并執行查詢并返回數據。然后我想創建一個數組,其中包含配置中包含的任何車輛,并將 json 響應解組到其中。我正在嘗試動態創建對象,這樣我就可以避免檢查車輛是否=汽車、車輛是否=公共汽車等,因為我最終會擁有多種類型的車輛,但可能并不總是擁有所有車輛,而且看起來很啰嗦。
2 回答

慕的地10843
TA貢獻1785條經驗 獲得超8個贊
該函數返回類型Car
和Bus
寫入的值。如果您希望輸入的變量main
具有特定類型,請使用類型斷言:
c := makeInstance("Car").(Car)
如果您的目標是獲取指向這些類型值的指針,則返回指針makeInstance
:
func makeInstance(name string) interface{} { return reflect.New(typeRegistry[name]).Interface() }

拉風的咖菲貓
TA貢獻1995條經驗 獲得超2個贊
您可能應該停下來閱讀有關接口值類型斷言的內容。Go 不是一種動態類型的語言,您嘗試做的事情很可能會失?。?/p>
只要您在與您一起工作,interface{}
您就無法在不進行反射的情況下訪問這些字段(制造商、型號、座位、路線...)。如果你想寫x.Make
你必須有一個x
類型Car
或*Car
(而不是接口{})。
要從c
of 類型interface{}
變為例如 a,Car
您必須鍵入 assert:
var car Car = c.(Car)
請注意,您不能進行動態類型斷言(沒有反射),c.(Car)
如果 c 包含例如 a ,那將會失敗Bus
。因此,在 json.Unmarshaling 到通用接口{}之后,您將必須打開已知類型并斷言該類型。這意味著您無論如何都要為每種類型編寫專用代碼。
- 2 回答
- 0 關注
- 142 瀏覽
添加回答
舉報
0/150
提交
取消