• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
package main

import (
	"fmt"
)

/*
值传递
函数的【形式参数】是对【实际参数】的值拷贝
所有对地址中内容的修改都与外界的实际参数无关
所有基本数据类型作为参数时,都是值传递
*/
func ChangeBaseValue(v int)  {
	fmt.Printf("main: v address=%p\n",&v)
	v *= 2
	//函数返回时所有局部变量(此处包含形式参数v)都被释放了
}

/*
引用传递(地址传递)
函数的【形式参数】记录的是【实际参数】的地址
所有对地址中内容的修改都会直接改变外界的实际参数
*/
func ChangeBaseValuePtr(v *int)  {
	fmt.Printf("main: v address=%p\n",v)
	*v *= 2
}

type Person struct {
	Age int
}

/*
结构体的值传递
形式参数p是对实际参数zhangsan的值拷贝
对p做任何事情都不会对zhangsan产生任何影响
p是函数执行过程中产生的局部变量,函数执行完毕就释放
*/
func ChangeObjectValue(p Person)  {
	fmt.Printf("ChangeObjectValue:p address=%p\n", &p)
	p.Age *= 2
	//函数返回时所有局部变量(此处包含形式参数v)都被释放了
}


/*
结构体的引用传递(地址传递)
形式参数p记录的是实际参数zhansan的内存地址
对p中的内容做任何修改都是对zhangsan的直接修改
p是函数执行过程中产生的局部变量,函数执行完毕就释放
*/
func ChangeObjectValuePtr(p *Person)  {
	fmt.Printf("ChangeObjectValue:p address=%p\n", p)
	p.Age *= 2
	//函数返回时所有局部变量(此处包含形式参数v)都被释放了
}

/*
数组作为形参:值传递
切片和map:现有内容/元素都是引用传递
*/
func ChangeContainerValue(array [3]int, slice []int, mMap map[string]int)  {
	fmt.Printf("ChangeContainerValue:array[0] address=%p\n",&array[0])
	fmt.Printf("ChangeContainerValue:slice[0] address=%p\n",&slice[0])
	fmt.Printf("ChangeContainerValue:map address=%p\n",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\n",&a)
	ChangeBaseValue(a)
	fmt.Printf("main: a address=%p\n",&a)
	fmt.Println(a)

	ChangeBaseValuePtr(&a)
	fmt.Printf("main: a address=%p\n",&a)
	fmt.Println(a)
}

/*结构体的值传递与引用传递*/
func main022() {
	zhangsan := Person{Age: 10}
	fmt.Printf("main: zhangsan address=%p\n", &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\n",&array[0])
	fmt.Printf("main:slice[0] address=%p\n",&slice[0])
	fmt.Printf("main:map address=%p\n",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]

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言计算函数执行时间发布时间:2022-07-10
下一篇:
go 安装环境发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap