这篇文章主要介绍了去值传递和地址传递的案例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
先来看个简单的例子
1,变量前面加个,表示这个变量的地址(也就是这个变量的指针),指针变量前面加*表示这个指针对应的值(自己理解下)
//主要。gopackage主要 func之(){ s:=100 p:=, s//s的地址给了p fmt.Println (* p)//100所以p对应的值变成了100 * p +=100 fmt.Println (* p)//200 fmt.Println (s)//200 p和s相同的地址,所以年代也变成200}//演示。gopackage主要 函数main () { 之()}
去默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如函数(__arg1)。
2,普通值传递(注意这个例子,看起来很简单,但是容易忽略)
func ByValue1 (n1 int) {//此时n1是n的一个拷贝,所以地址不一样 fmt.Println(和n1)//0 xc00000a098}包主要 函数main () { 护士:=100 fmt.Println xc00000a090(和n)//0 ByValue1 (n)//传递副本}
如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加,符号,比如,变量)传递给函数,这就是按引用传递,比如函数(和__arg1),此时传递给函数的是一个指针。
3,如果想用地址传递
函数主要(){ 护士:=100 fmt.Println xc00000a090(和n)//0 ByReference(和n)//传递指针 fmt.Println (n)//200}//注意函数参数类型需要是用指针符号(*)func ByReference (n1 * int) { * n1 +=100 fmt.Println (n1)//0 xc00000a090地址与n相同,所以n值被改变了//注意//ip:=, n1//这个写法有问题,表示地址的地址//fmt.Println (ip)}
4,看下数组
- <李> (a)数组也是值传递
加勒比海盗:=[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}李>
5、下面是切片的例子(可变的数组)切片是引用传递
函数主要(){ 加勒比海盗:=int [] {1、3、5、6、7} bbb (arr)//没有使用,符号 fmt.Print (arr[0])//11结果已经改变,说明数组是地址传递//就算不通过函数,也是引用传递//加勒比海盗:=int [] {1、3、5、6、7}//arr2:=加勒比海盗//arr2 [1]=0//fmt.Print (arr)//[1 0 5 6 7]}//aaafunc bbb (arr1 int []) { arr1 [0] +=10}
- <李> (b)在函数调用时,像切片(片),字典(地图),接口(接口),通道(频道)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。李>
感谢你能够认真阅读完这篇文章,希望小编分享转值传递和地址传递的案例内容对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,遇到问题就找,详细的解决方法等着你来学习!