在Golang,var s []int和之间有什么区别s := make([]int, 0)?
我发现两者都有效,但哪一个更好?
我是Go编程的新手.我已经阅读了编程书,该片包含三个部分:指向数组的指针,长度和容量.
我在nil切片之间感到困惑(切片没有底层数组指向,len = 0,cap = 0),非零切片只有len = 0,cap = 0和空切片.
任何人都可以告诉你的零片和空片是否相同?如果它们两者不同,请告诉我们这两者有什么区别?
如何测试切片是否为空?
此外,指针在非零切片中保持什么值,其长度和容量为零?
区分 nil 切片有什么意义,即。未初始化的切片和空切片,即。已初始化但空切片?
我理解其中的差异,但我想知道这两种情况之间存在细微差异背后的动机是什么?出于所有意图和目的,nil 切片和空切片在使用时表现相同。
似乎如果 Go 开发人员只有一种情况,例如只允许空切片,它就会简化心理模型并消除细微错误的来源。
创建这两个用例是否有原因?
注意: 声明切片还是制作切片?没有回答我的问题,因为它比较切片声明与 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)