zigenzoog
@zigenzoog
Долой точку с запятой! Только гошечка!

Почему в результате выводятся различные адреса?

Утрировал часть своего кода до этого:

ссылка на песочницу

package main

import "fmt"

type Test struct {
	array []Array
}

type Array struct {
	value float32
}

func (t *Test) Testing() {
	for i, a := range t.array {
		if i == 0 {
			fmt.Printf("%T %v\n", a, &a.value)
			fmt.Printf("%T %v\n", t.array[i], &t.array[i].value)
		}
	}
}

func main() {
	t := Test{}
	t.array = make([]Array, 3)
	t.Testing()
}


Пример результата:
main.Array 0xc00010000c
main.Array 0xc000114000

Почему в результате выводятся различные адреса?
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov
Senior software developer, system architect
Это происходит потому, что вы храните значения, а не указатели и, соответственно, вот тут for i, a := range t.array в `a` - создаётся копия value.
Чтобы адреса были одинаковые нужно хранить указатели, а не значения, т.е. нужно делать вот так
type Test struct {
	array []*Array
}

Поправил ваш код в песочнице, теперь адреса одинаковые
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы