Golang Go语言中新的一天,新的烦恼。内存空间的开辟问题。
package main
import “fmt”
func main() {
s1 := []byte{1, 2, 3}
s2 := []byte{4, 5}
fmt.Println(AppendByte(s1, s2...))
fmt.Println(s1)
}
func AppendByte(slice []byte, data …byte) []byte {
//slice[0]=111 // 引用传递,会修改原 slice
m := len(slice)
n := m + len(data)
if n > cap(slice) {
newSlice := make([]byte, (n+1)*2)
copy(newSlice, slice)
slice = newSlice
//问题:上面这个 slice 是新开辟的内存空间?已经原始原来的那个 slice 的内存空间了,是吧~?
fmt.Println(&slice)
//我想比较 slice 的地址,可是输出的是&[1 2 3 0 0 0 0 0 0 0 0 0],怎么输出 0xc42000e1d0 这种类型的?
}
slice = slice[0:n] //最左边的这个 slice 的内存空间是不是也新开辟的
fmt.Println(“slice:”, slice)
copy(slice[m:n], data)
fmt.Println(“slice2”, slice)
return slice
}
Golang Go语言中新的一天,新的烦恼。内存空间的开辟问题。
更多关于Golang Go语言中新的一天,新的烦恼。内存空间的开辟问题。的实战教程也可以访问 https://www.itying.com/category-94-b0.html
爱你们,快帮帮这个失了智的楼主。
更多关于Golang Go语言中新的一天,新的烦恼。内存空间的开辟问题。的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
- 是的
2. fmt.Printf("%p", &slice)
3. 不是
我勒个擦go<br>fmt.Println(&slice)<br>fmt.Printf("%p", &slice) <br>
在Golang(Go语言)中,内存空间的开辟是一个核心且常见的问题,但同时也是Go语言强大内存管理机制的一部分。以下是一些关于Go语言内存空间开辟的专业解答:
-
栈内存与堆内存:
- 栈内存:用于存储局部变量,分配和释放速度非常快,但空间有限。
- 堆内存:用于存储全局变量和生命周期较长的对象,空间较大,但分配和释放速度相对较慢。Go语言的垃圾回收机制主要负责管理堆内存。
-
逃逸分析:
- 编译器通过逃逸分析决定变量应该分配在栈上还是堆上。这有助于减少不必要的堆内存分配,提高内存使用效率。
-
垃圾回收(GC):
- Go语言采用并发标记-清除垃圾回收算法,自动管理内存,减少内存泄漏和碎片。
- 开发者可以通过调整GOGC环境变量等参数来调优垃圾回收机制,以适应不同的应用场景。
-
内存池(sync.Pool):
- 用于对象的缓存和复用,减少内存分配和垃圾回收的开销。
- 适用于频繁创建和销毁的对象,如切片、映射等。
总之,Go语言提供了强大的内存管理机制,开发者只需遵循一些规范,就可以有效地利用这些机制来优化内存使用。