下面由golang教程栏目给大家介绍go 值传递和地址传递的例子 ,希望对需要的朋友有所帮助!

先来看个简单的例子

1、变量前面加个&表示这个变量的地址(也就是这个变量的指针),指针变量前面加*表示这个指针对应的值 (自己理解下)

//main.gopackage mainfunc 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 mainfunc main() {  ByAss()}

Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)。

2、普通值传递 (注意这个例子,看起来很简单,但是容易忽略)

func ByValue1(n1 int) {  //此时n1 是n 的一个拷贝,所以地址不一样  fmt.Println(&n1)//0xc00000a098}package mainfunc 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、看下数组

  • (a)数组也是值传递
    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}

5、下面是切片的例子 (可变的数组)切片是引用传递

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}
  • (b)在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。

更多相关文章

  1. golang中方法的receiver为指针和不为指针有什么区别
  2. 关于Golang 指针理解
  3. go语言有指针吗
  4. IP地址与子网的作用和组成
  5. IP地址简介与配置
  6. MAC地址表和ARP表分别是什么?
  7. 只要两步,用Python将地址标记在地图上!
  8. 从零到一学懂区块链(3):地址
  9. 对比 C++ 和 Python,谈谈指针与引用

随机推荐

  1. AppCode iOS 应用开发 开发环境
  2. Android学习整理 -1- Fragment 学习
  3. android apk 自我保护技术-加密apk
  4. Android(安卓)MVP开发模式 google 官方Mv
  5. 开源自己写的刷票器软件(windows和Android
  6. Android应用程序开发以及背后的设计思想
  7. Android(安卓)10个快速开发框架:Afinal、T
  8. Android关于分包方案、插件化动态加载APK
  9. Android学习路线(二十七)键值对(SharedPrefe
  10. Android(安卓)资源加载与匹配