Why can't I duplicate a slice with `copy()`?

前端 未结 6 701
情书的邮戳
情书的邮戳 2021-01-29 23:02

I need to make a copy of a slice in Go and reading the docs there is a copy function at my disposal.

The copy built-in function copies elements from a so

6条回答
  •  一整个雨季
    2021-01-29 23:10

    The copy() runs for the least length of dst and src, so you must initialize the dst to the desired length.

    A := []int{1, 2, 3}
    B := make([]int, 3)
    copy(B, A)
    C := make([]int, 2)
    copy(C, A)
    fmt.Println(A, B, C)
    

    Output:

    [1 2 3] [1 2 3] [1 2]
    

    You can initialize and copy all elements in one line using append() to a nil slice.

    x := append([]T{}, []...)
    

    Example:

    A := []int{1, 2, 3}
    B := append([]int{}, A...)
    C := append([]int{}, A[:2]...)
    fmt.Println(A, B, C)    
    

    Output:

    [1 2 3] [1 2 3] [1 2]
    

    Comparing with allocation+copy(), for greater than 1,000 elements, use append. Actually bellow 1,000 the difference may be neglected, make it a go for rule of thumb unless you have many slices.

    BenchmarkCopy1-4                50000000            27.0 ns/op
    BenchmarkCopy10-4               30000000            53.3 ns/op
    BenchmarkCopy100-4              10000000           229 ns/op
    BenchmarkCopy1000-4              1000000          1942 ns/op
    BenchmarkCopy10000-4              100000         18009 ns/op
    BenchmarkCopy100000-4              10000        220113 ns/op
    BenchmarkCopy1000000-4              1000       2028157 ns/op
    BenchmarkCopy10000000-4              100      15323924 ns/op
    BenchmarkCopy100000000-4               1    1200488116 ns/op
    BenchmarkAppend1-4              50000000            34.2 ns/op
    BenchmarkAppend10-4             20000000            60.0 ns/op
    BenchmarkAppend100-4             5000000           240 ns/op
    BenchmarkAppend1000-4            1000000          1832 ns/op
    BenchmarkAppend10000-4            100000         13378 ns/op
    BenchmarkAppend100000-4            10000        142397 ns/op
    BenchmarkAppend1000000-4            2000       1053891 ns/op
    BenchmarkAppend10000000-4            200       9500541 ns/op
    BenchmarkAppend100000000-4            20     176361861 ns/op
    

提交回复
热议问题