package main
import (
"fmt"
)
type Person struct {
name string
age int
}
func main() {
// 使用new关键字为Person结构体分配内存并返回指针
var p *Person = new(Person)
// 通过指针为结构体字段赋值
p.name = "张三"
p.age = 30
fmt.Printf("姓名: %s, 年龄: %d\n", p.name, p.age)
}
Go语言内存管理机制
- 堆与栈:在Go语言中,基本类型(如整数、字符串、布尔值等)和函数内部的局部变量通常分配在栈上,因为栈的分配和释放效率高。而使用
new
关键字创建的结构体实例会分配在堆上。例如上述代码中 new(Person)
就是在堆上分配内存,返回指向堆内存地址的指针。
- 垃圾回收(GC):Go语言采用自动垃圾回收机制。当一个堆上的对象(如
Person
实例)不再被任何变量引用时,垃圾回收器会在适当的时候回收这块内存。在上述代码中,如果 p
变量超出其作用域或者被赋值为 nil
,那么指向的 Person
实例就不再被引用,垃圾回收器会在后续的垃圾回收周期中将其占用的堆内存回收。垃圾回收器采用标记 - 清除算法或者三色标记法等算法来识别和回收不再使用的对象。