• 技术文章 >后端开发 >Golang

    关于go值传递和地址传递的例子

    藏色散人藏色散人2020-10-30 15:00:20转载552

    下面由golang教程栏目给大家介绍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、看下数组

    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}

    以上就是关于go值传递和地址传递的例子的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:go golang go教程
    上一篇:当Golang遇到高并发秒杀~ 下一篇:分享一次腾讯Go开发岗位面试经过
    PHP编程就业班

    相关文章推荐

    • 国内下载 go get golang.org/x 包失败的解决办法• Golang如何对excel进行处理• golang如何复用http.request.body• 当Golang遇到高并发秒杀~

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网