• GO语言基础---值传递与引用传递


    package main
    
    import (
    	"fmt"
    )
    
    /*
    值传递
    函数的【形式参数】是对【实际参数】的值拷贝
    所有对地址中内容的修改都与外界的实际参数无关
    所有基本数据类型作为参数时,都是值传递
    */
    func ChangeBaseValue(v int)  {
    	fmt.Printf("main: v address=%p
    ",&v)
    	v *= 2
    	//函数返回时所有局部变量(此处包含形式参数v)都被释放了
    }
    
    /*
    引用传递(地址传递)
    函数的【形式参数】记录的是【实际参数】的地址
    所有对地址中内容的修改都会直接改变外界的实际参数
    */
    func ChangeBaseValuePtr(v *int)  {
    	fmt.Printf("main: v address=%p
    ",v)
    	*v *= 2
    }
    
    type Person struct {
    	Age int
    }
    
    /*
    结构体的值传递
    形式参数p是对实际参数zhangsan的值拷贝
    对p做任何事情都不会对zhangsan产生任何影响
    p是函数执行过程中产生的局部变量,函数执行完毕就释放
    */
    func ChangeObjectValue(p Person)  {
    	fmt.Printf("ChangeObjectValue:p address=%p
    ", &p)
    	p.Age *= 2
    	//函数返回时所有局部变量(此处包含形式参数v)都被释放了
    }
    
    
    /*
    结构体的引用传递(地址传递)
    形式参数p记录的是实际参数zhansan的内存地址
    对p中的内容做任何修改都是对zhangsan的直接修改
    p是函数执行过程中产生的局部变量,函数执行完毕就释放
    */
    func ChangeObjectValuePtr(p *Person)  {
    	fmt.Printf("ChangeObjectValue:p address=%p
    ", p)
    	p.Age *= 2
    	//函数返回时所有局部变量(此处包含形式参数v)都被释放了
    }
    
    /*
    数组作为形参:值传递
    切片和map:现有内容/元素都是引用传递
    */
    func ChangeContainerValue(array [3]int, slice []int, mMap map[string]int)  {
    	fmt.Printf("ChangeContainerValue:array[0] address=%p
    ",&array[0])
    	fmt.Printf("ChangeContainerValue:slice[0] address=%p
    ",&slice[0])
    	fmt.Printf("ChangeContainerValue:map address=%p
    ",mMap)
    
    	array[0] = 100
    	slice[0] = 200
    	mMap["老大"] = 300
    }
    
    
    func ChangeContainerValuePtr(array *[3]int, slice *[]int, mMap *map[string]int)  {
    
    	(*array)[0] = 100
    	(*slice)[0] = 200
    	(*mMap)["老大"] = 300
    	*slice = append(*slice, 4)
    	(*mMap)["老四"] = 4
    }
    
    
    /*基本类型的值传递与引用传递*/
    func main021() {
    	var a = 10
    	fmt.Printf("main: a address=%p
    ",&a)
    	ChangeBaseValue(a)
    	fmt.Printf("main: a address=%p
    ",&a)
    	fmt.Println(a)
    
    	ChangeBaseValuePtr(&a)
    	fmt.Printf("main: a address=%p
    ",&a)
    	fmt.Println(a)
    }
    
    /*结构体的值传递与引用传递*/
    func main022() {
    	zhangsan := Person{Age: 10}
    	fmt.Printf("main: zhangsan address=%p
    ", &zhangsan)
    	//ChangeObjectValue(zhangsan)
    	ChangeObjectValuePtr(&zhangsan)
    	fmt.Println(zhangsan.Age)
    }
    
    func main() {
    	var array = [3]int{1,2,3}
    	slice := make([]int, 0)
    	slice = append(slice, 1, 2, 3)
    	mMap := make(map[string]int)
    	mMap["老大"] = 1
    	mMap["老二"] = 2
    	mMap["老三"] = 3
    	fmt.Printf("main:array[0] address=%p
    ",&array[0])
    	fmt.Printf("main:slice[0] address=%p
    ",&slice[0])
    	fmt.Printf("main:map address=%p
    ",mMap)
    	//ChangeContainerValue(array, slice, mMap)
    	ChangeContainerValuePtr(&array, &slice, &mMap)
    
    	fmt.Println(array)
    	fmt.Println(slice)
    	fmt.Println(mMap)
    }
    

    输出:

    main:array[0] address=0xc0000102e0
    main:slice[0] address=0xc000010300
    main:map address=0xc000062240
    [100 2 3]
    [200 2 3 4]
    map[老大:300 老二:2 老三:3 老四:4]
    

      

  • 相关阅读:
    .NET面试题系列(五)数据结构(Array、List、Queue、Stack)及线程安全问题
    一个使用 Go 的思维来帮助您构建并开发 Go 应用程序的开源框架
    UML类图学习
    服务器防攻击手段
    .NET面试题系列(四)计算机硬件知识
    .NET面试题系列(三)排序算法
    ASP.NET MVC学习(五)之MVC原理解析
    socketWriter.go
    multiWriter.go
    timeCache.go
  • 原文地址:https://www.cnblogs.com/yunweiqiang/p/12392331.html
Copyright © 2020-2023  润新知