1.若是map的一個屬性是strct,要修改這個strct的屬性值得方法:java
type S struct {
name string
}指針
func main() {code
m := map[string]*S{"x": &S{"one"}}
m["x"].name = "two"
fmt.Println(m["x"])string
}class
補充一下 * &的知識:變量
&
符號的意思是對變量取地址,如:變量a
的地址是&a
*
符號的意思是對指針取值,如:*&a
,就是a
變量所在地址的值,固然也就是a
的值了map
*
和 &
能夠互相抵消,同時注意,*&
能夠抵消掉,但&*
是不能夠抵消的 a
和*&a
是同樣的,都是a的值,值爲1 (由於*&
互相抵消掉了)
同理,a
和*&*&*&*&a
是同樣的,都是1 (由於4個*&
互相抵消掉了)方法
由於有 var b *int = &a
因此 a
和*&a
和*b
是同樣的,都是a的值,值爲1 (把b
當作&a
看)時間
由於有 var c **int = &b
因此 **c
和**&b
是同樣的,把&約去後
會發現**c
和*b
是同樣的 (從這裏也不難看出,*c
和b
也是同樣的)
又由於上面獲得的*&a
和*b
是同樣的
因此 **c
和*&a
是同樣的,再次把&約去後 **c
和a
是同樣的,都是1co
不信你試試?
運行的結果內的地址值(0xc200開頭的)可能會因不一樣機器運行而不一樣,你懂的
$ go run main.go a = 1 &a = 0xc200000018 *&a = 1 b = 0xc200000018 &b = 0xc200000020 *&b = 0xc200000018 *b = 1 c = 0xc200000020 *c = 0xc200000018 &c = 0xc200000028 *&c = 0xc200000020 **c = 1 ***&*&*&*&c = 1 x = 1
*&
能夠在任什麼時候間抵消掉,但&*
不能夠被抵消的,由於順序不對
fmt.Println("*&a\t=\t",*&a) //成功抵消掉,打印出1,即a的值 fmt.Println("&*a\t=\t",&*a) //沒法抵消,會報錯