面试题答案
一键面试package main
import (
"fmt"
)
// 定义结构体
type MyStruct struct {
id int
name string
data []string
}
// 定义一个函数创建MyStruct实例
func NewMyStruct(id int, name string, data []string) *MyStruct {
return &MyStruct{
id: id,
name: name,
data: data,
}
}
// 定义一个方法打印MyStruct的内容
func (ms *MyStruct) Print() {
fmt.Printf("ID: %d, Name: %s, Data: %v\n", ms.id, ms.name, ms.data)
}
// 这里不需要特别标注生命周期,因为Go语言的垃圾回收机制会自动管理内存,避免悬空指针
// 对于函数NewMyStruct返回的指针,Go会确保返回的结构体实例在其所有引用都消失后才被回收
// 对于方法Print,接收器*MyStruct的生命周期由调用该方法的实例决定,只要实例存在,方法就能安全访问其成员
在Go语言中,由于垃圾回收机制的存在,一般不需要像Rust那样显式标注生命周期来避免悬空指针问题。Go的编译器和运行时系统会自动管理内存,确保在对象没有任何引用时才回收内存,从而有效避免悬空指针。函数返回结构体指针时,Go会确保该结构体实例在其所有引用都消失后才被回收。方法的接收器的生命周期由调用该方法的实例决定,只要实例存在,方法就能安全访问其成员。