понедельник, 27 апреля 2020 г.

Доступ к приватным полям с помощью отражения в Golang

С помощью отражения можно читать, но не записывать неэкспортированные поля структуры, определенной в другом пакете.

В этом примере мы получаем доступ к неэкспортированному полю 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


Читайте также:


Комментариев нет:

Отправить комментарий