这篇文章主要介绍了go值传递和地址传递的案例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
先来看个简单的例子
1、变量前面加个&表示这个变量的地址(也就是这个变量的指针),指针变量前面加*表示这个指针对应的值 (自己理解下)
//main.gopackage main
func ByAss() {
s := 100
p := &s // s 的地址给了p
fmt.Println(*p) //100 所以p对应的值变成了100
*p += 100
fmt.Println(*p) //200
fmt.Println(s) //200 p和s相同的地址,所以s也变成200}//demo.gopackage main
func main() {
ByAss()}
Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)。
2、普通值传递 (注意这个例子,看起来很简单,但是容易忽略)
func ByValue1(n1 int) {
//此时n1 是n 的一个拷贝,所以地址不一样
fmt.Println(&n1)//0xc00000a098}package main
func main() {
n := 100
fmt.Println(&n) //0xc00000a090
ByValue1(n)//传递副本}
如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加 & 符号,比如 &variable)传递给函数,这就是按引用传递,比如 Function(&arg1),此时传递给函数的是一个指针。
3、如果想用地址传递
func main() {
n := 100
fmt.Println(&n) //0xc00000a090
ByReference(&n) //传递指针
fmt.Println(n) //200}//注意函数 参数类型需要是用指针符号(*)func ByReference(n1 *int) {
*n1 += 100
fmt.Println(n1)//0xc00000a090 地址与n相同, 所以n值被改变了
//注意
//ip := &n1//这个写法有问题,表示地址的地址
//fmt.Println(ip)}
4、看下数组
arr := [5]int{1,3,5,6,7}arrByValue(&arr) //也需要使用& 符号fmt.Println(arr) //[100 300 5 6 7]func arrByValue(arr1 *[5]int) {
arr2 := arr1
arr2[0] = 100
arr2[1] = 300}
func main() {
arr := []int{1,3,5,6,7}
bbb(arr) //没有使用& 符号
fmt.Print(arr[0])// 11 结果已经改变,说明数组是地址传递
//就算不通过函数,也是引用传递
//arr := []int{1,3,5,6,7}
//arr2 := arr
//arr2[1] = 0
//fmt.Print(arr)//[1 0 5 6 7]}//aaafunc bbb(arr1 []int) {
arr1[0] += 10}
感谢你能够认真阅读完这篇文章,希望小编分享go值传递和地址传递的案例内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。