StructTransmit值傳遞和引用傳遞
阿新 • • 發佈:2020-12-13
目錄
StructTransmit值傳遞和引用傳遞
程式碼
package strcurt_ptr import "fmt" type Item0 struct { Name0 string } type Item1 struct { Item0 Name1 string } type Item2 struct { I1 *Item1 Name2 string } type Itme3 struct { Item2 Name3 string } func newItem3() *Itme3 { return &Itme3{ Item2: Item2{ I1: &Item1{ Item0: Item0{Name0: "0"}, Name1: "1", }, Name2: "2", }, Name3: "3", } } func change(i *Itme3) { i.Name3 += "3" i.Name2 += "2" i.I1.Name1 += "1" i.I1.Name0 += "0" } // 除了頭部,都是引用傳遞 type N0 struct { Name0 string } type N1 struct { Name1 string } type N2 struct { Name2 string } type N3 struct { N2 N1 N0 Name3 string } func newN3() *N3 { return &N3{ N2: N2{Name2:"2"}, N1: N1{Name1:"1"}, N0: N0{Name0:"0"}, Name3: "3", } } func newn3NoAddr() N3 { return N3{ N2: N2{Name2:"2"}, N1: N1{Name1:"1"}, N0: N0{Name0:"0"}, Name3: "3", } } func changeN3(n *N3) { n.Name0 += "0" n.Name1 += "1" n.Name3 += "2" n .Name2 += "3" } func changeN3Noaddr(n N3) { n.Name0 += "0" n.Name1 += "1" n.Name3 += "2" n .Name2 += "3" } func Main() { fmt.Println("----結構體裡面帶地址的和不帶地址的混雜-----------------") i := newItem3() fmt.Println("原始資料itme3", i) change(i) fmt.Println("void函式之後", i) } func Main2() { fmt.Println("----------new的時候帶地址----------") n3 := newN3() fmt.Println("原始資料", n3) changeN3(n3) fmt.Println("改造之後", n3) fmt.Println("----------new的時候地址不存在----------") noAddrN3 := newn3NoAddr() fmt.Println("沒有取地址的原始資料為", noAddrN3) changeN3Noaddr(newn3NoAddr()) fmt.Println("改造之後", noAddrN3) } ## 測試Main()和Main()2輸出 ----結構體裡面帶地址的和不帶地址的混雜----------------- 原始資料itme3 &{{0xc000004500 2} 3} void函式之後 &{{0xc000004500 22} 33} ----------new的時候帶地址---------- 原始資料 &{{2} {1} {0} 3} 改造之後 &{{23} {11} {00} 32} ----------new的時候地址不存在---------- 沒有取地址的原始資料為 {{2} {1} {0} 3} 改造之後 {{2} {1} {0} 3} ok go-newbase/strcurt_ptr 0.204s
小結
- 對於值傳遞,一般不用
- 引用傳遞,也就是直接傳地址,就會改變原來的結構
- 這個結構體一般只需要最外層new的時候帶上地址就可以了
- 對於struct裡面的不帶地址的 n.Name0 = n.N0.Name0