Golang的值传递和引用传递

其实和js一样,主要看是基本数据类型还是引用数据类型

基本数据类型值传递。引用数据类型引用传递

但是

package main

import "fmt"

func main() {
    a := 1
    var f1 = func(a int) {
        a += 1
    }
    f1(a)
    fmt.Println(a) // 值传递 1还是1 不会变2 
    
    b := map[string]string{
        "name":"jack",
    }
    var f2 = func(a map[string]string) {
        a["name"] = "rose"
    }
    f2(b)
    fmt.Println(b) // 引用传递 - jack会变成rose
}

但是slice又不太一样,append会变更地址相当于值传递,而没有append的时候又是引用传递

package main

import "fmt"

func main() {
    c := []int{1}
    var f3 = func(c []int) {
        c[0] = 3 //不会改变c的地址 - 将会变成引用传递

    }
    f3(c)
    fmt.Println(c)

    d := []int{1}
    fmt.Printf("地址p =  %p
",d)
    var f4 = func(d []int) {
        d = append(d, 2) //会改变c的地址
        fmt.Printf("地址p = %p
",d)
    }
    f4(d)
    fmt.Println(d)

}

 博客:

https://zhuanlan.zhihu.com/p/366908019

https://www.cnblogs.com/wang_yb/p/12126884.html

I can see a bigger world.
原文地址:https://www.cnblogs.com/xuweiqiang/p/15155993.html