訪問go struct的私有變數
go_tips
建立struct
package model
type Student struct {
age int
}
func NewStudent(age int) *Student {
return &Student{
age: age,
}
}
func (s *Student) GetAge() int {
return s.age
}
釐清struct
- 因此可以想到或許能用pointer的方式嘗試訪問
搭配使用reflect
- 為了要訪問struct的成員變數,需要搭配使用reflect來獲得struct的成員offset
- 此時可以想到或許只要拿到struct的pointer再加上該成員的offset即可訪問
實作
- 獲得struct的變量並且檢查type
- 之所以用pointer的方式是因為直接訪問st的話得到的會是
*model.Student
st := model.NewStudent(12)
log.Println(reflect.TypeOf(*st)) // model.Student
- 獲得offset
v := reflect.ValueOf(*st)
typ := v.Type()
age, find := typ.FieldByName("age")
if !find {
log.Println("cannot find age from student")
}
offset := age.Offset
- 獲取值並且嘗試更改已確認能對該struct私有成員進行操作訪問
ptr := (*int)(unsafe.Add(unsafe.Pointer(st), offset))
log.Println(st.GetAge()) //12
*ptr = 24
log.Println(*ptr) //24