一、结构体是值传递是引用传递是取决于结构体元素 - 如果是基本类型肯定不会影响原有值,如果是切片这种引用类型肯定会影响原有值
type Person struct {
Name string
List []string
}
func TestStruct(t *testing.T) {
var p = Person{
Name: "jack",
List: []string{"hello"},
}
fmt.Printf("%p %s %s \n", &p, p.Name, p.List[0])
P(p)
fmt.Printf("%p %s %s \n", &p, p.Name, p.List[0])
}
func P(p Person) {
p.Name = "rose"
p.List[0] = "world"
fmt.Printf("P %p\n", &p)
}
输出结果
0xc000074ff0 jack hello
P 0xc000075020
0xc000074ff0 jack world
1、可以看到TestStruct内的p的地址和 P 函数内的 p的地址不是同一个
2、结构体之中的基本数据类型没有变更 - jack没有变成rose
3、由于p.List是切片,p.List本质上是一个指针,传递过去了,如果在函数P之中容量没有变更,底层指向的数组没有变更,那么这两个指向的底层数组是同一个,就会变更,但是如果是append操作就会导致容量变更,从而 P 函数内部指向的切片底层的数组不是同一个
二、指定指针传递,函数调用者和被调用者的指针才是一致的,否则都会在被调用函数内部重新初始化变量存储
func TestTransF(t *testing.T) { var p = Person{} fmt.Printf("%p \n", &p) TransFTwo(&p) } func TransFTwo(person *Person) { fmt.Printf("%p \n", person) }
输出结果:
0xc00009cff0 0xc00009cff0