Я просто играю с Go и еще не имею хорошей ментальной модели, когда структуры передаются по значению или по ссылке.
Это может быть очень глупый вопрос, но я просто хочу немного поэкспериментировать и посмотреть, продолжаю ли я работать над одним и тем же объектом, или я сделал его копию (передал его по значению).
Есть ли способ распечатать указатель (или внутренний идентификатор, если значение указателя изменено gc) объекта?
package main
import ( "runtime" )
type Something struct {
number int
queue chan int
}
func gotest( s *Something, done chan bool ) {
println( "from gotest:")
println( &s )
for num := range s.queue {
println( num )
s.number = num
}
done <- true
}
func main() {
runtime.GOMAXPROCS(4)
s := new(Something)
println(&s)
s.queue = make(chan int)
done := make(chan bool)
go gotest(s, done)
s.queue <- 42
close(s.queue)
<- done
println(&s)
println(s.number)
}
дает мои окна (скомпилированная версия 8g):
0x4930d4
from gotest:
0x4974d8
42
0x4930d4
42
Почему значение указателя в рамках процедуры go имеет другое значение? Количество на исходном объекте изменилось, и он работал с одним и тем же объектом. Есть ли способ увидеть постоянный идентификатор объекта?