Go ';容量';使用“不安全”将[]字节转换为字符串时的内存?

Go ';容量';使用“不安全”将[]字节转换为字符串时的内存?,go,Go,我见过人们使用不安全的指针有效地将[]字节转换为字符串 我了解它在做什么,以及一般涉及的危险,但对记忆有疑问 由于片的结构有一个数据指针、一个长度和一个容量,但字符串没有容量,如果在堆上创建了b,内存会发生什么变化?垃圾收集器是否知道需要单独跟踪容量?或者这会导致内存泄漏吗 编辑: 我知道如何重新切片字符串和切片。上述代码适用于需要从[]字节转换为字符串但希望避免完整副本的情况 问题是关于我们从结构中删除的容量以及它是否会导致GC问题。语句var s=*(*string)(unsafe.Poin

我见过人们使用
不安全的指针
有效地将
[]字节
转换为
字符串

我了解它在做什么,以及一般涉及的危险,但对记忆有疑问

由于片的结构有一个数据指针、一个长度和一个容量,但字符串没有容量,如果在堆上创建了
b
,内存会发生什么变化?垃圾收集器是否知道需要单独跟踪容量?或者这会导致内存泄漏吗

编辑:

我知道如何重新切片字符串和切片。上述代码适用于需要从
[]字节
转换为
字符串
但希望避免完整副本的情况


问题是关于我们从结构中删除的
容量以及它是否会导致GC问题。

语句
var s=*(*string)(unsafe.Pointer(&b))
将数据和长度从值复制到值

该语句不会更改运行时对切片标头的解释。容量不会从切片标头中删除

仅复制数据和长度不会导致GC问题

  • 复制操作后,字符串标头和切片标头值都有效
  • 垃圾收集器不假定字符串备份数组的大小等于字符串头中的长度。例如,GC处理安全代码
    s:=“foobarxxx”[:6]
    ,其中字符串头
    s
    的长度为6,而后备数组的大小为9

谢谢,但这是从字符串开始的。我上面显示的代码是当您得到一个
[]字节时,但需要将其转换为字符串,并希望避免复制。好的,这是有意义的。
s
是标头的副本,因此数据指针和长度被复制到新内存中,而原始标头是一个完全独立的实体,可以单独跟踪。谢谢
var b = []byte{'f', 'o', 'o', 'b', 'a', 'r'}
var s = *(*string)(unsafe.Pointer(&b))