Go 居然可以通过 reflect 设置私有变量的值为零?

今天在用mgo的时候,发现有一个bug,在读取数据并存放在结构之后,之前结构里设置的变量都被重置了。
gopackagemain
import(
"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=10
println("Addressofs",&s)
println("Addressoft",&s.testField)
//这时testField的值为10
fmt.Println(s.testField)
//在数据库里读取数据,复制给结构s
err=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。
gopackagemain
import(
"fmt"
"reflect"
)
typeTestStructstruct{
testFieldint
}
funcmain(){
data:=TestStruct{}
data.testField=111
value:=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")
}
}
这作何解释?怎么避免私有变量被赋值?
LEATH
浏览 264回答 2
2回答

狐的传说

你这段代码,实际上执行一个值的覆盖操作。相当于以下这段代码:data:=TestStruct{}newData:=TestStruct{}data=newData
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript