1. 程式人生 > 實用技巧 >StructTransmit值傳遞和引用傳遞

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