久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      結(jié)合實例講解Go struct實例化和賦值

      Golang 中 struct 各種實例化和賦值方式,一會兒是值傳遞,一會兒又是指針,讓人一頭霧水,于是我決定梳理一下,整個明白。

      先定義一個結(jié)構(gòu)體,下面結(jié)合代碼進行講解。

      package mainimport "fmt"type Person struct {     Name string     Age int     Descprtion string}

      實例一

      p 以最常規(guī)的方式實例化一個 struct,變量 p 得到一個 Person 結(jié)構(gòu)體。

      p := Person{} p.Name = "小明"  fmt.Printf("p:%+v 變量地址:%pn", p, &p) fmt.Println("===========")  // result: // p:{Name:小明 Age:0 Descprtion:} 變量地址:0xc000078480 // ===========

      實例二

      變量 p1 由 p 賦值而來,由于 Golang 語言是值傳遞,賦值后,對 p1 的修改并不會影響到 p;

      從第一個輸出也可以看得出,Golang 的賦值并不存在像PHP變量賦值時的寫時復制(copy on write)機制。

      結(jié)合實例講解Go struct實例化和賦值

      p1 := p fmt.Printf("p1:%+v 變量地址:%pn", p1, &p1) // 不存在寫時復制 p1.Name = "小明p1" fmt.Printf("p:%+v 變量地址:%pn", p, &p) fmt.Printf("p1:%+v 變量地址:%pn", p1, &p1) fmt.Println("===========")  // result: // p1:{Name:小明 Age:0 Descprtion:} 變量地址:0xc0000784e0 // p:{Name:小明 Age:0 Descprtion:} 變量地址:0xc000078480 // p1:{Name:小明p1 Age:0 Descprtion:} 變量地址:0xc0000784e0 // ===========

      實例三

      利用取地址符將 p 的地址賦值給 p2,變量 p2 是一個指針,存放著指向 p 的地址。當 p2 修改了結(jié)構(gòu)體中元素 Name 時,通過 p 訪問結(jié)構(gòu)體對應的值也相應地發(fā)生了變化。

      結(jié)合實例講解Go struct實例化和賦值

      p2 := &p // 等同于 var p2 *Person = &p fmt.Printf("p2:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p2, p2, &p2) p2.Name = "小明p2" fmt.Printf("p1:%+v 變量地址:%pn", p, &p) fmt.Printf("p2:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p2, p2, &p2) fmt.Println("===========")  // result: // p2:&{Name:小明 Age:0 Descprtion:} 指針變量指向地址(變量值):0xc000078480 變量地址:0xc000006030 // p1:{Name:小明p2 Age:0 Descprtion:} 變量地址:0xc000078480 // p2:&{Name:小明p2 Age:0 Descprtion:} 指針變量指向地址(變量值):0xc000078480 變量地址:0xc000006030 // ===========

      實例四

      變量 p3 由 new(Person) 得來。new 將開辟一塊內(nèi)存,返回內(nèi)存地址給 p3,也即 p3 是一個指向這塊內(nèi)存的指針。

      p3 是指向結(jié)構(gòu)體的指針,它有兩種方式可以操作結(jié)構(gòu)體,p3.Age = 3*p3 = Person{Name: "小明p3"}, 如果第二種方式后操作,將會覆蓋第一種方式對結(jié)構(gòu)體的修改。

      由于 p3 是指針,當 p3 賦值給 p5 時,p5 也將指向這塊內(nèi)存地址。

      結(jié)合實例講解Go struct實例化和賦值

      p3 := new(Person) fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3) p3.Age = 3 // 等同于 (*p3).Age = 3 fmt.Println("================ 操作 Age ================") fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3) *p3 = Person{     Name: "小明p3", } fmt.Println("================ 操作 Name ================") fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3) p5 := p3 fmt.Println("================ p5 := p3 ================") fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3) fmt.Printf("p5:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p5, p5, &p5) p3.Name = "小明p3修改" fmt.Println("================ p3 修改 ================") fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3) fmt.Printf("p5:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p5, p5, &p5) fmt.Println("===========")  // result: // p3:&{Name: Age:0 Descprtion:} 指針變量指向地址(變量值):0xc000078630 變量地址:0xc000006038 // ================ 操作 Age ================ // p3:&{Name: Age:3 Descprtion:} 指針變量指向地址(變量值):0xc000078630 變量地址:0xc000006038 // ================ 操作 Name ================ // p3:&{Name:小明p3 Age:0 Descprtion:} 指針變量指向地址(變量值):0xc000078630 變量地址:0xc000006038 // ================ p5 := p3 ================ // p5:&{Name:小明p3 Age:0 Descprtion:} 指針變量指向地址(變量值):0xc000078630 變量地址:0xc000006040 // ================ p3 修改 ================ // p3:&{Name:小明p3修改 Age:0 Descprtion:} 指針變量指向地址(變量值):0xc000078630 變量地址:0xc000006038 // p5:&{Name:小明p3修改 Age:0 Descprtion:} 指針變量指向地址(變量值):0xc000078630 變量地址:0xc000006040 // ===========

      示例五

      p4 的實例化方式也將得到一個指針,這種實例化方式與 p3 的實例化是相同的,但 p4 的寫法更常使用。

      結(jié)合實例講解Go struct實例化和賦值

      p4 := &Person{     Name: "小明p4",}fmt.Printf("%+v %pn", p4, &p4)// result:// &{Name:小明p4 Age:0 Descprtion:} 0xc000006048

      附完整代碼:

      package mainimport "fmt"type Person struct {     Name string     Age int     Descprtion string}func main() {     p := Person{}     p.Name = "小明"      fmt.Printf("p:%+v 變量地址:%pn", p, &p)     fmt.Println("===========")      p1 := p     fmt.Printf("p1:%+v 變量地址:%pn", p1, &p1) // 不存在寫時復制     p1.Name = "小明p1"     fmt.Printf("p:%+v 變量地址:%pn", p, &p)     fmt.Printf("p1:%+v 變量地址:%pn", p1, &p1)     fmt.Println("===========")      p2 := &p     fmt.Printf("p2:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p2, p2, &p2)     p2.Name = "小明p2"     fmt.Printf("p1:%+v 變量地址:%pn", p, &p)     fmt.Printf("p2:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p2, p2, &p2)     fmt.Println("===========")      p3 := new(Person)     fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3)     p3.Age = 3 // 等同于 (*p3).Age = 3     fmt.Println("================ 操作 Age ================")     fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3)     *p3 = Person{         Name: "小明p3",     }     fmt.Println("================ 操作 Name ================")     fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3)     p5 := p3     fmt.Println("================ p5 := p3 ================")     fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3)     fmt.Printf("p5:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p5, p5, &p5)     p3.Name = "小明p3修改"     fmt.Println("================ p3 修改 ================")     fmt.Printf("p3:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p3, p3, &p3)     fmt.Printf("p5:%+v 指針變量指向地址(變量值):%p 變量地址:%pn", p5, p5, &p5)     fmt.Println("===========")      p4 := &Person{         Name: "小明p4",     }     fmt.Printf("%+v %pn", p4, &p4)}

      End!

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號