GO中运行时类型的结构的新实例 [英] New instance of struct from the type at runtime in GO

查看:125
本文介绍了GO中运行时类型的结构的新实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在运行时使用类型(reflect.TypeOf)来创建结构的新实例。我在StackOverflow上关注了这个线程如何在Go中运行时从Type中创建一个新的实例?。这是我的实现(也在 http://play.golang.org/p/BtX0d5Ytu8 ):
$ b $ pre $ $ $ $ $

$ f $ $
$反映
编码/ json
字节


类型UserInfo结构{
电子邮件字符串`json:email`
FullName字符串`json:name`
ID字符串`json:_id`
}

func main(){
fmt.Println( Hello,playground)
db:= DBEngine {}
db.DB = make(map [string] [] byte)

db.Register(UserInfo {})

db.Put(142321,UserInfo {jdoe@acme.com,John Doe,142321})
ret:= db.Get(142321 )
fmt.Println(TypeOf(ret):,reflect.TypeOf(ret))
fmt.Println(ValueOf(ret):,reflect.ValueOf(ret))
fmt.Println(Value:,ret)
}

类型DBEngine结构体{
模板接口{}
DB map [string] [] byte

$ b $ func(db * DBEngine)Register(v interface {}){
db.Template = v
}

// Set用户定义的对象
func(db * DBEngine)Put(key string,v interface {}){
res,_:= json.Marshal(v)
db.DB [key] = res
}

//返回用户定义的对象
func(db * DBEngine)获取(键字符串)接口{} {
解码器:= json.NewDecoder bytes.NewReader(db.DB [键]));
fmt.Println(Value [] byte:,string(db.DB [key]))
ret:= reflect.New(reflect.TypeOf(db.Template))。Elem()
fmt.Println(reflect.TypeOf(db.Template),ret)
decoder.Decode(ret)
return ret.Interface()
}

由于某些原因,我总是会得到空的struct。我无法设置字段或修改。有人可能会提出什么问题吗?

解决方案

我检查了您的代码。当你使用reflect创建一个类型时,你得到了一个 Value 类型的值,需要调用 Interface()来获得新生成的值的接口

检查代码
http://play.golang.org/p/CHWSV8EG7D


I am trying to create new instance of a struct, using it's type (reflect.TypeOf) at runtime. I have followed this thread on StackOverflow How do you create a new instance of a struct from it's Type at runtime in Go?. Here is my implementation (also at http://play.golang.org/p/BtX0d5Ytu8):

package main

import (
    "fmt"
    "reflect"
    "encoding/json"
    "bytes"
)

type UserInfo struct {
    Email    string `json:"email"`
    FullName string `json:"name"`
    ID       string `json:"_id"`
}

func main() {
    fmt.Println("Hello, playground")
    db := DBEngine{}
    db.DB = make(map[string][]byte)

    db.Register(UserInfo{})

    db.Put("142321", UserInfo{"jdoe@acme.com", "John Doe", "142321"})
    ret := db.Get("142321")
    fmt.Println("TypeOf(ret):", reflect.TypeOf(ret))
    fmt.Println("ValueOf(ret):", reflect.ValueOf(ret))
    fmt.Println("Value:", ret)
}

type DBEngine struct {
    Template interface{}
    DB       map[string][]byte
}

func (db *DBEngine) Register(v interface{}) {
    db.Template = v
}

//Set User defined object
func (db *DBEngine) Put(key string, v interface{}) {
    res, _ := json.Marshal(v)
    db.DB[key] = res
}

//Return user defined object
func (db *DBEngine) Get(key string) interface{} {
    decoder := json.NewDecoder(bytes.NewReader(db.DB[key]));
    fmt.Println("Value []byte:", string(db.DB[key]))
    ret := reflect.New(reflect.TypeOf(db.Template)).Elem()
    fmt.Println(reflect.TypeOf(db.Template), ret)
    decoder.Decode(ret)
    return ret.Interface()
}

For some reason, I always get empty struct. I am unable to set fields or modify. Can someone suggest what is wrong?

解决方案

i reviewed your code. when you new a type with reflect, you got a value in Value type, need to call Interface() to get the interface of that new generated value

check the code http://play.golang.org/p/CHWSV8EG7D

这篇关于GO中运行时类型的结构的新实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆