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
}

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

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

Войти через центр авторизации
Похожие вопросы
Level Travel Москва
от 130 000 до 200 000 ₽
от 3 000 до 4 200 $
Digital Horizon Москва
До 220 000 ₽
12 авг. 2020, в 15:55
2000 руб./за проект
12 авг. 2020, в 15:48
3000 руб./за проект