golang 基礎知識6

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是同樣的 (從這裏也不難看出,*cb也是同樣的) 
又由於上面獲得的*&a*b是同樣的 
因此 
**c*&a是同樣的,再次把
&約去後 
**ca是同樣的,都是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)  //沒法抵消,會報錯
相關文章
相關標籤/搜索