与内置 API 文档相反,append() 函数并不总是创建新切片。这是由原始切片的容量和要添加的元素数量决定的。
在提供的代码片段中,递归地创建布尔值组合,感叹号表示发送到通道的切片添加选项函数。然而,在 main() 中另一侧出现的切片被修改了。
切片数据类型与其内部表示之间的区别引起了混乱。切片描述符由两个整数(长度和容量)和一个指向底层数据的指针组成。因此,append() 返回一个带有新描述符的新切片,但指向数据的指针相同。
这在以下代码示例中进行了说明:
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) // Create a slice with zero length and capacity 5 s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(a) b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(b) fmt.Println(a) }</code>
输出:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6]
这表明 a 和 b 共享相同的数据指针,因为原始切片仍然有容量。但是,如果我们将容量减少到 4:
<code class="go">s := make([]int, 0, 4)</code>
输出变为:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5]
由于原始切片不再有足够的容量,append() 创建一个新切片b.
的新数据指针以上是Golang 的 `append()` 函数何时分配新切片?的详细内容。更多信息请关注PHP中文网其他相关文章!