📌  相关文章
📜  go 值和引用类型 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 15:30:59.979000             🧑  作者: Mango

Go 值和引用类型

Go 语言中所有的值都是以值传递的方式传递给函数的,这包括基本类型和复合类型。在传递复合类型时,是传递其指针或副本。

值类型

值类型包括所有基本类型(int,float,string,bool 等)以及复合类型中没有包含指针的类型(数组,结构体等)。

func modify(s string, num int, arr [3]int) {
    s = "world"
    num = 42
    arr[0] = 100
}

func main() {
    str := "hello"
    num := 10
    arr := [3]int{1, 2, 3}
    fmt.Println("Before modification: ", str, num, arr)
    modify(str, num, arr)
    fmt.Println("After modification: ", str, num, arr)
}

输出:

Before modification: hello 10 [1 2 3]
After modification: hello 10 [1 2 3]

可以看到,在 modify() 函数中修改的值只影响了函数内的拷贝,没有影响到原始值。

引用类型

引用类型是指包含指针的复合类型,如切片、映射、通道和结构体等。

func modifySlice(slice []int) {
    slice[0] = 100
}

func modifyMap(m map[string]int) {
    m["foo"] = 100
}

func modifyStruct(person *Person) {
    person.Age = 20
}

func main() {
    s := []int{1, 2, 3}
    m := map[string]int{"foo": 1, "bar": 2}
    p := Person{Name: "Alice", Age: 18}

    modifySlice(s)
    fmt.Println(s) // [100 2 3]

    modifyMap(m)
    fmt.Println(m) // map[bar:2 foo:100]

    modifyStruct(&p)
    fmt.Println(p) // {Alice 20}
}

可以看到,在 modifySlice()modifyMap()modifyStruct() 函数中针对指针所指向的数据进行了修改,这样会影响到原始值,在这种情况下,我们需要使用指针作为函数的参数来传递引用类型。