Go 内存分配管理的完整攻略
Go语言内存管理继承了C语言的双层结构:堆和栈。栈是自动管理的,而程序员需要负责管理堆上的内存。Go语言采用一个称为垃圾回收器的进程来管理堆上的内存。
内存分配
Go语言的内存分配是通过new()
和make()
进行的。
new()
new()
函数会为类型分配内存,并返回指向该类型零值的指针。它的语法为:
p := new(Type)
例如创建一个长度为10的int类型的切片,可以这样写:
p := new([10]int)
make()
make()
函数会为特定的引用类型分配内存并返回它。它接受两个参数:一个是类型,另一个是容量。它的语法为:
p := make(Type, capacity)
例如,创建一个长度为10的int类型的切片,可以这样写:
p := make([]int, 10)
如果要创建一个map类型的映射,可以这样写:
p := make(map[string]int)
内存回收
Go语言自带的垃圾回收器会处理在运行时分配的内存,并设置未使用的内存可以被自动回收。
在运行时,Go的垃圾回收器会根据需要自动处理内存回收。回收器主要拥有以下三个阶段:
1.停止-终止:程序停止,垃圾回收器扫描堆和跟踪指向堆的指针并停止存在。
2.标记:垃圾回收器扫描所有跟踪的指针,标记可以被一个或多个根对象访问的对象。
3.清扫: Go垃圾回收器释放未标记的堆内存。
示例
示例1:new()函数
package main
import (
"fmt"
)
func main() {
p := new(int)
fmt.Println(*p) //0
*p = 123
fmt.Println(*p) //123
}
此示例通过new()函数分配了一个新的整数并使用指针p访问它。我们将值设置为123并打印它,输出结果为:
0
123
示例2:make()函数
package main
import (
"fmt"
)
func main() {
p := make([]int, 10)
fmt.Println(p) //[0 0 0 0 0 0 0 0 0 0]
}
该示例调用make()函数分配一个包含10个零值的int类型切片并打印结果。
输出结果如下:
[0 0 0 0 0 0 0 0 0 0]
以上是Go内存分配和管理的完整攻略,期望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go 内存分配管理 - Python技术站