今天在用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")}}这作何解释?怎么避免私有变量被赋值?
狐的传说
相关分类