Кто-нибудь может объяснить мне, почему адрес &c1.name
такой же после того, как он был изменен в функции changeMe()
. Я думал, что струны неизменны в Го.Неизменяемые строки в Go
package main
import "fmt"
type customer struct {
name string
age int
}
func main() {
c1 := customer{"Todd", 44}
fmt.Println(&c1.name) // 0x8201e4120
changeMe(&c1)
fmt.Println(c1) // {Rocky 44}
fmt.Println(&c1.name) // 0x8201e4120
}
func changeMe(z *customer) {
fmt.Println(z) // &{Todd 44}
fmt.Println(&z.name) // 0x8201e4120
z.name = "Rocky"
fmt.Println(z) // &{Rocky 44}
fmt.Println(&z.name) // 0x8201e4120
}
, потому что 'c1' является уникальным экземпляром, и его адрес не будет изменен, вы можете изменить только его значение –
да,' c1' не изменяется, но это поле 'имя 'неизменен, не так ли? Поэтому, когда я меняю имя, он должен иметь новый адрес. Что делать, если я хочу хранить экстремально большую строку, как компилятор хранит ее, когда она все еще использует тот же адрес? – camabeh