結構體拷貝
先宣告一個狗狗的結構體
type Dog struct {
name string
age int8
}
// 重寫String介面
func (Dog *Dog) String() string {
return fmt.Sprintf("this dog's name: %s, it's age: %d",Dog.name,Dog.age)
}
1.普通宣告及值拷貝
可以看到輸出的時候并沒有用到重寫的String方法(畢竟不是指標)
func main() {
d1 := Dog{"豆豆", 2}
d2 := d1 //值拷貝
d1.name = "小喵"
fmt.Println(d1) // {小喵 2}
fmt.Println(d2) // {豆豆 2}
}
2.普通宣告及指標淺拷貝
可以看到輸出的時候d1和d3的值是一樣的,但是d1沒有用到String,d3有
func main() {
d1 := Dog{"豆豆", 2}
d3 := &d1 //值拷貝
d1.name = "小喵"
fmt.Println(d1) // {小喵 2}
fmt.Println(d3) // this dog's name: 小喵, it's age: 2
}
3.結構體的new()宣告及指標的值拷貝
可以看到輸出的時候d1和d3的值是不一樣的
func main() {
d1 := new(Dog) // d1指向空間1
d3 := new(Dog) // d3指向空間2
d1.name = "豆豆"
d1.age = 2
*d3 = *d1 // 指標的值拷貝,用*d1取出來的是"豆豆"結構體,賦值給*d3,那么d3指向的空間2會拷貝空間1的內容,兩個空間還是獨立的
d1.name = "小喵"
fmt.Println(d1) // this dog's name: 小喵, it's age: 2
fmt.Println(d3) // this dog's name: 豆豆, it's age: 2
}
參考
區分指標參考和值參考,使用struct的時候,明確指標參考和值參考的區別很重要,
1.值參考賦值 比如 a:=b,這樣修改a.name=“ls”,不會影響到b.name,值參考是復制結構體,開辟一塊新的記憶體空間, a只是b的一個副本,而不是指向b的參考,
2.指標參考賦值 比如 a:=&b ,這樣修改a.name=“ls”,會影響到b.name,指標參考是指向結構體記憶體地址的參考,同一塊記憶體空間
總結1,值參考不會互相影響兩個變數值的獨立,指標參考則會互相影響,因為他們都指向同一塊記憶體地址
總結2:值參考只是復制的一個副本,不是指向記憶體地址的參考;指標參考,指標是指向記憶體地址的參考,因此使用它操作的不是結構體的副本而是本身,
指標參考的時候,比如 b:=&a,此時b是指標,因此必須使用*b對其進行參考(列印值)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/260110.html
標籤:區塊鏈
