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

4 回复

爱你们,快帮帮这个失了智的楼主。

更多关于Golang Go语言中新的一天,新的烦恼。内存空间的开辟问题。的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


  1. 是的
    2. fmt.Printf("%p", &slice)
    3. 不是

我勒个擦
go<br>fmt.Println(&amp;slice)<br>fmt.Printf("%p", &amp;slice) <br>

在Golang(Go语言)中,内存空间的开辟是一个核心且常见的问题,但同时也是Go语言强大内存管理机制的一部分。以下是一些关于Go语言内存空间开辟的专业解答:

  1. 栈内存与堆内存

    • 栈内存:用于存储局部变量,分配和释放速度非常快,但空间有限。
    • 堆内存:用于存储全局变量和生命周期较长的对象,空间较大,但分配和释放速度相对较慢。Go语言的垃圾回收机制主要负责管理堆内存。
  2. 逃逸分析

    • 编译器通过逃逸分析决定变量应该分配在栈上还是堆上。这有助于减少不必要的堆内存分配,提高内存使用效率。
  3. 垃圾回收(GC)

    • Go语言采用并发标记-清除垃圾回收算法,自动管理内存,减少内存泄漏和碎片。
    • 开发者可以通过调整GOGC环境变量等参数来调优垃圾回收机制,以适应不同的应用场景。
  4. 内存池(sync.Pool)

    • 用于对象的缓存和复用,减少内存分配和垃圾回收的开销。
    • 适用于频繁创建和销毁的对象,如切片、映射等。

总之,Go语言提供了强大的内存管理机制,开发者只需遵循一些规范,就可以有效地利用这些机制来优化内存使用。

回到顶部