• GO学习笔记:函数传值与传指针


      当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在copy上。

      为了验证我们上面的说法,我们来看一个例子:

      package main

      import "fmt"

      //简单的一个函数,实现了参数+1的操作

      func add1(a int) int {

      a = a+1 // 我们改变了a的值

      return a //返回一个新值

      }

      func main() {

      x := 3

      fmt.Println("x = ", x) // 应该输出 "x = 3"

      x1 := add1(x) //调用add1(x)

      fmt.Println("x+1 = ", x1) // 应该输出"x+1 = 4"

      fmt.Println("x = ", x) // 应该输出"x = 3"

      }

      看到了吗?虽然我们调用了add1函数,并且在add1中执行a = a+1操作,但是上面例子中x变量的值没有发生变化

      理由很简单:因为当我们调用add1的时候,add1接收的参数其实是x的copy,而不是x本身。

      那你也许会问了,如果真的需要传这个x本身,该怎么办呢?

      这就牵扯到了所谓的指针。我们知道,变量在内存中是存放于一定地址上的,修改变量实际是修改变量地址处的内存。只有add1函数知道x变量所在的地址,才能修改x变量的值。所以我们需要将x所在地址&x传入函数,并将函数的参数的类型由int改为*int,即改为指针类型,才能在函数中修改x变量的值。此时参数仍然是按copy传递的,只是copy的是一个指针。请看下面的例子:

      package main

      import "fmt"

      //简单的一个函数,实现了参数+1的操作

      func add1(a *int) int { // 请注意,

      *a = *a+1 // 修改了a的值

      return *a // 返回新值

      }

      func main() {

      x := 3

      fmt.Println("x = ", x) // 应该输出 "x = 3"

      x1 := add1(&x) // 调用 add1(&x) 传x的地址

      fmt.Println("x+1 = ", x1) // 应该输出 "x+1 = 4"

      fmt.Println("x = ", x) // 应该输出 "x = 4"

      }

      这样,我们就达到了修改x的目的。那么到底传指针有什么好处呢?

      1、传指针使得多个函数能操作同一个对象。

      2、传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用指针是一个明智的选择。

      3、Go语言中string,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针)(编辑:雷林鹏 来源:网络)

  • 相关阅读:
    [STL][C++]MAP
    [原创]南水之源A*(A-Star)算法
    php+mysql模糊查询功能
    php中如何传递Session ID
    初识jsonp
    跨站脚本攻击XSS
    XSS危害——session劫持
    PHP中获取当前页面的完整URL
    smarty获得当前url的方法分享
    表空间的管理方式有哪几种,各有什么优劣?
  • 原文地址:https://www.cnblogs.com/pengpeng1208/p/9719111.html
Copyright © 2020-2023  润新知