MST
星途 面试题库

面试题:Go语言中指针与内存管理:基础运用

在Go语言中,假设有一个结构体 `Person` 包含 `name`(字符串类型)和 `age`(整数类型)字段。请编写一段代码,使用指针为该结构体分配内存,并对结构体字段进行赋值,同时阐述在这个过程中Go语言的内存管理机制是如何工作的。
38.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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语言内存管理机制

  1. 堆与栈:在Go语言中,基本类型(如整数、字符串、布尔值等)和函数内部的局部变量通常分配在栈上,因为栈的分配和释放效率高。而使用 new 关键字创建的结构体实例会分配在堆上。例如上述代码中 new(Person) 就是在堆上分配内存,返回指向堆内存地址的指针。
  2. 垃圾回收(GC):Go语言采用自动垃圾回收机制。当一个堆上的对象(如 Person 实例)不再被任何变量引用时,垃圾回收器会在适当的时候回收这块内存。在上述代码中,如果 p 变量超出其作用域或者被赋值为 nil,那么指向的 Person 实例就不再被引用,垃圾回收器会在后续的垃圾回收周期中将其占用的堆内存回收。垃圾回收器采用标记 - 清除算法或者三色标记法等算法来识别和回收不再使用的对象。