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