p1是結構體,p2是結構體指針。
2. 聲明並賦值結構體和結構體指針
package main import "fmt" type Person struct { name string age int } func main() { // 初始化結構體(創建一個結構體對象) p1 := Person{"張三", 18} fmt.Println(p1.name, p1.age) // 初始化結構體指針 p2 := &Person{"李四", 28} fmt.Println(p2.name, p2.age) // new方法先聲明結構體指針,在賦值 var p3 = new(Person) p3.name = "王五" p3.age = 38 fmt.Println(p3.name, p3.age) }
3. 結構體賦值拷貝,結構體指針賦值引用
// 結構體指針賦值 p3 := &Person{name: "lisi", age: 25} p4 := p3 fmt.Println(*p3, *p4) p3.name = "王五" fmt.Println(*p3, *p4)
4. 結構體中哪種數據類型不拷貝?
其實本質上都拷貝了,只不過由於數據存儲方式的不同,導致拷貝的有些是數據,有些是內存地址(指針)
感覺拷貝:字符串、數組、整型等;感覺不拷貝:map、切片
package main import "fmt" type Address struct { city, state string } type Person struct { name string age int hobby [2]string num []int parent map[string]string Address } func main() { // 在存在結構體嵌套是,賦值會拷貝一份所有的數據 p1 := Person{ name: "liSi", age: 18, hobby: [2]string{"乒乓", "CF"}, parent: map[string]string{"name": "maYaNan"}, num: []int{11, 22}, Address: Address{city: "北京", state: "河北省"}, } p2 := p1 p1.Address.city = "天津" // 嵌套的結構體拷貝了 p1.hobby[0] = "gaga" // 數組拷貝了 p1.num[0] = 88 // 切片沒拷貝 (內部維護指針指向數據存儲的地方) p1.parent["name"] = "maYaJun" // map沒拷貝 (內部維護指針指向數據存儲的地方) fmt.Println(p1) // {lisi 18 {天津 河北省}} fmt.Println(p2) // {lisi 18 {北京 河北省}} }
注意:對於那些默認拷貝的情況,可以改變為指針類型,讓數據實現同步修改。
package main import "fmt" type Address struct { city, state string } type Person struct { name string age int hobby *[2]string num []int parent map[string]string Address } func main() { // 在存在結構體嵌套是,賦值會拷貝一份所有的數據 p1 := Person{ name: "liSi", age: 18, hobby: &[2]string{"乒乓", "CF"}, parent: map[string]string{"name": "maYaNan"}, num: []int{11, 22}, Address: Address{city: "北京", state: "河北省"}, } p2 := p1 p1.hobby[0] = "gaga" // 數組指針沒有拷貝 fmt.Println(*p1.hobby) // {lisi 18 {天津 河北省}} fmt.Println(*p2.hobby) // {lisi 18 {北京 河北省}} }