zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    nodejs--模块化
    node-package.json 文件package-lock.json
    NPM
    REPL介绍
    nvm npm nrm 区别
    docker docker-compose安装
    微信小程序对接阿里云视频点播,备忘
    python requests包爬网页数据demo
    php redis扩展地址
    php7.2.4安装rabbitmq扩展的过程中错误处理
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14128499.html
Copyright © 2011-2022 走看看