今天在用mgo的时候,发现有一个bug,在读取数据并存放在结构之后,之前结构里设置的变量都被重置了。gopackagemainimport("fmt""gopkg.in/mgo.v2""gopkg.in/mgo.v2/bson""os")typeTestStructstruct{Idbson.ObjectId`bson:"_id"`testFieldint}funchandleError(errerror){iferr!=nil{panic(err)os.Exit(1)}}funcmain(){session,err:=mgo.Dial("localhost")handleError(err)c:=session.DB("test").C("test")id:=bson.NewObjectId()err=c.Insert(bson.M{"_id":id,})handleError(err)s:=TestStruct{}s.testField=10println("Addressofs",&s)println("Addressoft",&s.testField)//这时testField的值为10fmt.Println(s.testField)//在数据库里读取数据,复制给结构serr=c.FindId(id).One(&s)handleError(err)println("Addressofs",&s)println("Addressoft",&s.testField)//这时testField的值为0,testField为私有变量fmt.Println(s.testField)}查看了一下bson的源码,发现他是通过reflect来赋值的,我写了一个小Demo发现确实可以使用reflect将私有成员设置为0。gopackagemainimport("fmt""reflect")typeTestStructstruct{testFieldint}funcmain(){data:=TestStruct{}data.testField=111value:=reflect.ValueOf(&data).Elem()dataType:=value.Type()newData:=reflect.New(dataType).Elem()fmt.Println("TypeofData",dataType)value.Set(newData)ifdata.testField==0{fmt.Println("testFieldsettedto0")}}这作何解释?怎么避免私有变量被赋值?
2 回答
狐的传说
TA贡献1804条经验 获得超3个赞
你这段代码,实际上执行一个值的覆盖操作。相当于以下这段代码:data:=TestStruct{}newData:=TestStruct{}data=newData
添加回答
举报
0/150
提交
取消