亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于字符串動態創建對象

基于字符串動態創建對象

Go
MM們 2023-04-24 16:49:36
我正在嘗試基于字符串動態創建結構。在下面的示例中,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個贊

該函數返回類型CarBus寫入的值。如果您希望輸入的變量main具有特定類型,請使用類型斷言:

c := makeInstance("Car").(Car)

如果您的目標是獲取指向這些類型值的指針,則返回指針makeInstance

func makeInstance(name string) interface{} {
   return reflect.New(typeRegistry[name]).Interface()
}


查看完整回答
反對 回復 2023-04-24
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

您可能應該停下來閱讀有關接口值類型斷言的內容。Go 不是一種動態類型的語言,您嘗試做的事情很可能會失?。?/p>

只要您在與您一起工作,interface{}您就無法在不進行反射的情況下訪問這些字段(制造商、型號、座位、路線...)。如果你想寫x.Make必須有一個x類型Car*Car(而不是接口{})。

要從cof 類型interface{}變為例如 a,Car必須鍵入 assert:

var car Car = c.(Car)

請注意,您不能進行動態類型斷言(沒有反射),c.(Car)如果 c 包含例如 a ,那將會失敗Bus。因此,在 json.Unmarshaling 到通用接口{}之后,您將必須打開已知類型并斷言該類型。這意味著您無論如何都要為每種類型編寫專用代碼。


查看完整回答
反對 回復 2023-04-24
  • 2 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號