С помощью отражения можно читать, но не записывать неэкспортированные поля структуры, определенной в другом пакете.
В этом примере мы получаем доступ к неэкспортированному полю len в структуре List в пакете container/list:
package list
type List struct {
root Element
len int
}
Этот код читает значение len с помощью отражения.
package main
import (
"container/list"
"fmt"
"reflect"
)
func main() {
l := list.New()
l.PushFront("foo")
l.PushFront("bar")
// Получаем reflect.Value fv
// для неэкспортированного len.
fv := reflect.ValueOf(l).Elem().FieldByName("len")
fmt.Println(fv.Int()) // 2
// Пытаемся задать значение len.
fv.Set(reflect.ValueOf(3)) // НЕДОПУСТИМО
}
Вывод (получаем panic из-за недопустимого действия):
2
panic: reflect: reflect.Value.Set using value obtained using unexported field
goroutine 1 [running]:
reflect.flag.mustBeAssignable(0x1a2, 0x285a)
/usr/local/go/src/reflect/value.go:225 +0x280
reflect.Value.Set(0xee2c0, 0x10444254, 0x1a2, 0xee2c0, 0x1280c0, 0x82)
/usr/local/go/src/reflect/value.go:1345 +0x40
main.main()
../main.go:18 +0x280
Читайте также:
- ООП в Golang: методы не для классов, но для типов
- Объектно-ориентированное программирование с наследованием в Golang
- Спецификация Go: типы структур (struct types)
Комментариев нет:
Отправить комментарий