使用反射获取结构体字段的指针值
短信预约 -IT技能 免费直播动态提醒
珍惜时间,勤奋学习!今天给大家带来《使用反射获取结构体字段的指针值》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!
问题内容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 中的其他字段。我不确定如何覆盖 bson 编组,因为我使用的是 mongodb 驱动程序,而不是 mgo
我想获取手机指针的值和宠物的名称,但我得到的只是地址
如何获取该值,例如7777和格鲁特?谢谢
解决方案
您可以使用 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)
}
今天关于《使用反射获取结构体字段的指针值》的内容介绍就到此结束,如果有什么疑问或者建议,可以在编程网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341