面试题答案
一键面试- 函数内部对
p
的修改不会影响到原变量:- 在Go语言中,函数参数传递是值传递。当调用
modifyPerson(p Person)
函数时,会将原Person
变量的值复制一份传递给函数内部的p
。所以函数内部对p
的修改,修改的是这个副本,而不是原变量。
- 在Go语言中,函数参数传递是值传递。当调用
- 想要在函数内部修改原变量的处理方式:
- 可以通过传递指针来实现。将函数定义修改为
func modifyPerson(p *Person)
,调用函数时传递Person
变量的指针,例如:
type Person struct { name string age int } func modifyPerson(p *Person) { p.name = "newName" p.age = 20 } func main() { var p Person = Person{name: "oldName", age: 18} modifyPerson(&p) println(p.name) println(p.name) }
- 可以通过传递指针来实现。将函数定义修改为
- 如果
Person
结构体中嵌套了一个切片类型的字段,传递和修改该结构体时的情况:- 当传递包含切片字段的
Person
结构体时,仍然是值传递,即结构体的副本被传递到函数内部。 - 但是对于切片类型,切片本身是一个描述底层数组的结构体(包含指向底层数组的指针、切片长度和容量)。所以当函数内部修改切片的内容(例如添加、删除元素,修改元素值)时,会影响到底层数组,因为切片的指针指向的是同一个底层数组。而如果在函数内部重新给切片字段赋值(例如
p.sliceField = []int{1, 2, 3}
),这只是修改了副本中切片结构体的指针,不会影响原变量中的切片。例如:
type Person struct { name string age int sliceField []int } func modifyPerson(p Person) { p.sliceField[0] = 100 // 会影响原切片内容,因为指向同一个底层数组 p.sliceField = []int{1, 2, 3} // 不会影响原变量中的切片,只是修改了副本的切片指针 }
- 当传递包含切片字段的