StructTransmit值传递和引用传递

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

小结

  1. 对于值传递,一般不用
  2. 引用传递,也就是直接传地址,就会改变原来的结构
  3. 这个结构体一般只需要最外层new的时候带上地址就可以了
  4. 对于struct里面的不带地址的 n.Name0 = n.N0.Name0
posted @ 2020-12-13 13:56  maob  阅读(78)  评论(0编辑  收藏  举报