Можно ли изменить члены структуры, хранящейся в пустом интерфейсе

brk спросил: 07 октября 2018 в 12:27 в: go

У меня есть это:

type pair struct {
    a, b int
}

Затем я определяю две переменные:

x := pair{ 3, 4 }
var y interface{} = x

Я понимаю, что y не хранит ссылку на x, но копирует ее с помощью следующего кода:

x.b = 7
fmt.Println(x)
fmt.Println(y)
// got:
// {3 7}
// {3 4}

См. также https://github.com/ golang / go / blob / master / src / runtime / iface.go # L359

Есть ли способ изменить элемент pair.y скопированной структуры в y?

Попробовал это: (ошибка)

// cannot assign to y.(pair).b
y.(pair).b = 7

Попробовал это: (также ошибка)

// panic: reflect: reflect.Value.SetInt using value obtained using unexported field
v := reflect.ValueOf(y).FieldByName("b")
v.SetInt(33)

Измените "b" на "B"": (также не работает)

type pair {
    a, B int
}
// panic: reflect: reflect.Value.SetInt using unaddressable value
v := reflect.ValueOf(y).FieldByName("B")
v.SetInt(33)

Обновление:

Я не собираюсь менять x.b, используя y. Я хочу изменить поле y b в одиночку.

Спасибо за вашу помощь, но это не простой вопрос о значениях и ссылках.


0 ответов