golang中結構體和結構體指針的內存管理


 

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 {北京 河北省}}
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM