package main
import (
"fmt"
"reflect"
)
type PetDetails struct {
Name *string
}
type Student struct {
Fname string
Lname string
City string
Mobile *int
Pet *PetDetails
}
func main() {
i := 7777777777
petName := "Groot"
s := Student{"Chetan", "Tulsyan", "Bangalore", &i, &PetDetails{&petName}}
v := reflect.ValueOf(s)
typeOfS := v.Type()
for i := 0; i< v.NumField(); i++ {
fmt.Printf("Field: %s\tValue: %v\n", typeOfS.Field(i).Name, v.Field(i).Interface())
}
}
我正在尝试将这些结构转换为map [string] string,因为我需要用于mongoDB更新查询的地图。将我的结构转换为BSON之后,它不再查询{“ pet.name”:“ Groot”},而是变为{“ pet”:{“ name”:“ Groot”}},这将删除嵌入式文档pet中的其他字段。我不确定如何在使用mongodb驱动程序而不是mgo时覆盖BSON元帅
我想获取“移动指针”和“宠物的名字”的值,但是我得到的只是地址
如何获取该值,例如7777和Groot?谢谢
答案 0 :(得分:0)
您可以使用Elem
取消引用指针类型。
x := 5
ptr := reflect.ValueOf(&x)
value := ptr.Elem()
ptr.Type().Name() // *int
ptr.Type().Kind() // reflect.Ptr
ptr.Interface() // [pointer to x]
ptr.Set(4) // panic
value.Type().Name() // int
value.Type().Kind() // reflect.Int
value.Interface() // 5
value.Set(4) // this works
例如,要检索示例中的手机号码,应将main中的循环更改为:
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
value := field.Interface()
// If a pointer type dereference with Elem
if field.Kind() == reflect.Ptr {
value = field.Elem().Interface()
}
fmt.Printf("Field: %s\tValue: %v\n", typeOfS.Field(i).Name, value)
}