golang 動態 執行個體化 結構體

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。


真理 http://stackoverflow.com/questions/10210188/instance-new-type-golang

So, if I understand your question correctly, you are asking about how you can create an object when you just have the name of the type as string. So, for example, you might have a string "MyStruct" and you want to create an object of this type.

Unfortunately, that's not easily possible because Go is a statically typed language and the linker will eliminate dead code (or inline parts of it). So, there is no guarantee, that your final executable will even contain the code of "MyStruct".

You can however, maintain a global map[string]reflect.Type manually. For example by initializing this map in the init() function of your packages which defines such discover-able types. This will also tell the compiler that you are using the types. Afterwards, you can use this map to look up the reflect.Type of the type you want to create and use reflect.New to get a pointer to a new object of that type (stored as a reflect.Value). You can extract the object into an interface with something like this:

reflect.New(yourtype).Elem().Interface()

Elem() will de-reference the pointer and Interface() will return the reflected value as an interface{}. See The Laws of Reflection for further details.

PS: There might be a better way to structure your program which doesn't even require reflection and which let the compiler catch more errors. Have you considered using a factory method for example? An other easy solution might be to maintain a map[string]func() interface{} of functions which can be invoked to create a new object with that name.




http://mikespook.com/2012/07/%E5%9C%A8-golang-%E4%B8%AD%E7%94%A8%E5%90%8D%E5%AD%97%E8%B0%83%E7%94%A8%E5%87%BD%E6%95%B0/

但這裡有一個限制:這個 map 僅僅可以用原型是“func()”的沒有輸入參數或傳回值的函數。
如果想要用這個方法實現調用不同函數原型的函數,需要用到 interface{}。


***********參考*****************


1.  https://www.socketloop.com/tutorials/golang-fix-type-interface-has-no-field-or-no-methods-and-type-assertions-example

Golang : Fix type interface{} has no field or no methods and type assertions example



2. golang用字串反射執行個體化結構體

package main import ( "fmt" "reflect") type Foo struct {}type Bar struct {} //用於儲存執行個體化的結構體對象var regStruct map[string]interface{} func main() { str := "Bar" if regStruct[str] != nil {  t := reflect.ValueOf(regStruct[str]).Type()  v := reflect.New(t).Elem()  fmt.Println(v) } } func init() { regStruct = make(map[string]interface{}) regStruct["Foo"] = Foo{} regStruct["Bar"] = Bar{}}



3. http://stackoverflow.com/questions/17507697/dry-out-my-go-function-with-interfaces


kinds := map[string]func() Entity {    "user": func() Entity { return &User{} },    "space": func() Entity { return &Space{} },    "room": func() Entity { return &Room{} },}func Create(kind string) {    instance := kinds[kind]()    decoder.Decode(instance)    saveEntity(instance)}

4.  新手求解 golang 動態new struct 

http://www.oschina.net/question/1388294_141504?sort=default&p=2#answers

<span style="font-size:14px;">我現在是這樣做的var ModelObj map[string]interface{} = map[string]interface{}{"Member": new(Member), } func GetModObj(mod string) interface{} { if ModelObj[mod] != nil { return ModelObj[mod] } else { return nil } } </span>


5. http://stackoverflow.com/questions/13856539/how-do-you-get-struct-value-on-unknown-interface



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.