📅  最后修改于: 2023-12-03 15:30:59.979000             🧑  作者: Mango
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()
函数中针对指针所指向的数据进行了修改,这样会影响到原始值,在这种情况下,我们需要使用指针作为函数的参数来传递引用类型。