要声明具有非固定大小的空切片,最好是:
mySlice1 := make([]int, 0)
Run Code Online (Sandbox Code Playgroud)
要么:
mySlice2 := []int{}
Run Code Online (Sandbox Code Playgroud)
只是想知道哪一个是正确的方法.
假设我有以下长度为3的整数:
nums := [3]int{1,2,3}
然后我抓住前两个项目的切片
numSlice := nums[:2]
cap
在两种情况下调用numSlice和nums都会产生3,并len
分别产生2和3.
如果我然后附加到slice(numSlice = append(numSlice, 10)
),nums
则现在是底层数组()[1 2 10]
.cap
两者都保持为3,因为切片的底层数组是相同的,而切片的len现在是3.
但是,如果我再次附加到该切片(numSlice = append(numSlice, 20)
),则切片的基础数组必须更改 - 我们看到cap
现在已经为numSlice加倍并且len现在为4.
对于过于简单的解释感到抱歉,只是自己走过去,但有人可以向我解释底层阵列发生了什么,以及如何获得对新阵列的引用?
这是从切片略微修改的代码
var buffer [256] byte
func SubtractOneFromLength(slice []byte) []byte {
slice = slice[0 : len(slice)-1]
return slice
}
func main() {
slice := buffer[10:20]
fmt.Println("Before: len(slice) =", len(slice))
newSlice := SubtractOneFromLength(slice)
fmt.Println("After: len(slice) =", len(slice))
fmt.Println("After: len(newSlice) =", len(newSlice))
newSlice2 := SubtractOneFromLength(newSlice)
fmt.Println("After: len(newSlice2) =", len(newSlice2))
}
Run Code Online (Sandbox Code Playgroud)
它表示slice参数的内容可以通过函数修改,但其标题不能.如何在屏幕上打印newSlice2的标题?
注意: 声明切片还是制作切片?没有回答我的问题,因为它比较切片声明与 make slice,而我的问题比较切片文字与 make slice。这个问题有一个简单的答案,因为裸切片声明创建了一个 nil 切片,但是,如果您仔细阅读下面的问题,我根本不会创建一个 nil 切片。
有两种方法可以创建切片并附加到它。Example 1
我下面的代码显示了 as和两种方式Example 2
。
package main
import (
"fmt"
)
func main() {
// Example 1
a := []int{}
fmt.Printf("len(a): %d; cap(a): %d; a: %v\n", len(a), cap(a), a)
a = append(a, 10, 20, 30, 40, 50)
fmt.Printf("len(a): %d; cap(a): %d; a: %v\n", len(a), cap(a), a)
// Example 2
b := make([]int, 0)
fmt.Printf("len(b): %d; cap(b): %d; b: %v\n", len(b), cap(b), b)
b = append(b, 10, …
Run Code Online (Sandbox Code Playgroud)