zoukankan      html  css  js  c++  java
  • 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]
    

      

  • 相关阅读:
    win10企业版激活密钥
    百科知识 手机QQ的视频如何保存
    华为荣耀7手机如何开启开发者模式,开启调试模式
    C#如何设置控件水平对齐,垂直对齐
    C#如何实现挂机锁
    JAVA_MyEclipse常见配置NETGEAR路由器如何设置
    JAVA_MyEclipse如何加载Tomcat
    VC++_错误 无法打开包括文件“glglut.h” No such file or directory 怎么办
    生活娱乐 达尔优的键盘鼠标如何打开和关闭呼吸灯
    新版的豌豆荚如何连接电脑
  • 原文地址:https://www.cnblogs.com/yunweiqiang/p/12392331.html
Copyright © 2011-2022 走看看