面试题答案
一键面试package main
import "fmt"
// 定义Person结构体
type Person struct {
Name string
Age int
}
// 修改年龄的函数
func updateAge(p *Person, newAge int) {
p.Age = newAge
}
在Go语言中,当我们使用指针操作结构体时,涉及到其内存管理机制。Go语言有自动垃圾回收(GC)机制。当我们创建一个 Person
实例时,例如 p := &Person{Name: "John", Age: 30}
,这个实例会被分配在堆内存上(如果 p
的作用域较大,逃逸分析会将其分配到堆上)。
当我们将这个指针 p
传递给 updateAge
函数时,函数内部对指针指向的结构体字段进行修改,实际上是直接修改堆内存上对应的值。由于Go语言的GC机制,只要还有指针指向堆上的这个 Person
实例,它就不会被回收。只有当没有任何指针指向这个实例时,GC机制会在合适的时机回收这块内存,从而实现自动内存管理。
你可以通过以下方式调用这个函数:
func main() {
p := &Person{Name: "John", Age: 30}
updateAge(p, 35)
fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}