在Go中,如何在运行时从其类型创建对象的实例?我想你也需要先得到type对象的实际值?
我试图做懒惰的实例化以节省内存.
给定一个结构:
type MyStruct struct {
A int
B int
}
Run Code Online (Sandbox Code Playgroud)
和一个带结构名称的字符串
a := "MyStruct"
Run Code Online (Sandbox Code Playgroud)
要么
a := "mypkg.MyStruct"
Run Code Online (Sandbox Code Playgroud)
如何从字符串名称而不是结构创建结构的实例?我的想法是创建一个应用程序,其中所有结构都链接到二进制文件中,但是从字符串创建运行时实例.(一种元元)
我正在使用Go与GORM ORM.我有以下结构.关系很简单.One Town有多个地方,一个地方属于一个城镇.
type Place struct {
ID int
Name string
Town Town
}
type Town struct {
ID int
Name string
}
Run Code Online (Sandbox Code Playgroud)
现在我想查询所有地方,并与他们所有的领域相处相应的城镇的信息.这是我的代码:
db, _ := gorm.Open("sqlite3", "./data.db")
defer db.Close()
places := []Place{}
db.Find(&places)
fmt.Println(places)
Run Code Online (Sandbox Code Playgroud)
我的示例数据库有这些数据:
/* places table */
id name town_id
1 Place1 1
2 Place2 1
/* towns Table */
id name
1 Town1
2 Town2
Run Code Online (Sandbox Code Playgroud)
我收到了这个:
[{1 Place1 {0 }} {2 Mares Place2 {0 }}]
但是我期待收到这样的东西(这两个地方都属于同一个城镇):
[{1 Place1 {1 …
我在调用反射值的.FieldByName方法时遇到以下错误,确切的错误是: -
panic: reflect: call of reflect.Value.FieldByName on ptr Value
Run Code Online (Sandbox Code Playgroud)
而代码是: -
s := reflect.ValueOf(&value).Elem() (value is a struct)
metric := s.FieldByName(subval.Metric).Interface() (subval.Metric is a string)
Run Code Online (Sandbox Code Playgroud)
我知道这并不多,但这是我能得到的所有信息.
这是Go Playground代码的链接:http://play.golang.org/p/E038cPOoGp
我想递归地反映结构类型和值,但是失败了。我不知道如何递归地传递子结构。
错误如下。
panic: reflect: NumField of non-struct type
goroutine 1 [running]:
reflect.(*rtype).NumField(0xc0b20, 0xc82000a360)
/usr/local/go/src/reflect/type.go:660 +0x7b
Run Code Online (Sandbox Code Playgroud)
我有两个结构Person和Name
type Person struct {
Fullname NameType
Sex string
}
type Name struct {
Firstname string
Lastname string
}
Run Code Online (Sandbox Code Playgroud)
我Person在main中定义该结构,并使用递归函数显示该结构。
person := Person{
Name{"James", "Bound"},
"Male",
}
display(&person)
Run Code Online (Sandbox Code Playgroud)
的display函数递归显示结构。
func display(s interface{}) {
reflectType := reflect.TypeOf(s).Elem()
reflectValue := reflect.ValueOf(s).Elem()
for i := 0; i < reflectType.NumField(); i++ {
typeName := reflectType.Field(i).Name
valueType := reflectValue.Field(i).Type()
valueValue := reflectValue.Field(i).Interface()
switch …Run Code Online (Sandbox Code Playgroud)