就像一些进一步的信息。一些基准代码和内存分析显示,从 go 1.5.3 开始,两种方法都从堆中分配相同数量的内存,即以任何一种方式进行新副本。在从字节切片构建字符串时,编译器调用一个例程来制作字节的唯一副本——因为字符串是不可变的,而字节切片则不是。


$ go tool pprof -alloc_space so002.test cprof0

Entering interactive mode (type "help" for commands)

(pprof) list copy

Total: 9.66MB

    9.62MB     9.62MB (flat, cum) 99.55% of Total

         .          .     15:

         .          .     16:var global string

         .          .     17:

         .          .     18:func benchmarkcopy(b *testing.B, c int) {

         .          .     19:   big := "This is a long string"

         .       240B     20:   parts := strings.Split(big, " ")

         .          .     21:   old := parts[0]

         .          .     22:   jlimit := 100

         .          .     23:   for i := 0; i < b.N; i++ {

         .          .     24:       for j := 0; j < jlimit; j++ {

    3.21MB     3.21MB     25:           global = string([]byte(old))

         .          .     26:       }

         .          .     27:       for j := 0; j < jlimit; j++ {

         .          .     28:           b := []byte(old)

    3.21MB     3.21MB     29:           global = string(b)

         .          .     30:       }

         .          .     31:       for j := 0; j < jlimit; j++ {

    3.21MB     3.21MB     32:           new := make([]byte, len(old))

         .          .     33:           copy(new, old)

         .          .     34:           global = string(old)

         .          .     35:       }

         .          .     36:   }

         .          .     37:}