【发布时间】:2020-12-09 01:54:00
【问题描述】:
注意: Declare slice or make slice? 没有回答我的问题,因为它将切片声明与制作切片进行比较,而我的问题将切片文字与制作切片进行比较。这个问题的答案很简单,因为一个裸切片声明会创建一个 nil 切片,但是,如果您仔细阅读下面的问题,我根本不会创建一个 nil 切片。
有两种方法可以创建切片并附加到切片。我下面的代码以Example 1 和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, 20, 30, 40, 50)
fmt.Printf("len(b): %d; cap(b): %d; b: %v\n", len(b), cap(b), b)
}
输出:
len(a): 0; cap(a): 0; a: []
len(a): 5; cap(a): 6; a: [10 20 30 40 50]
len(b): 0; cap(b): 0; b: []
len(b): 5; cap(b): 6; b: [10 20 30 40 50]
使用[]int{} 和make([]int, 0) 创建空切片的两种方法是否等效?在任何情况下,他们的行为会有所不同?
【问题讨论】:
-
链接的问题又链接到相关文档:blog.golang.org/slices-intro。 TL;DR:
x := []int{}和x := make([]int, 0)之间没有功能差异。 -
你是对的。我说错了。
x := []int{}与make([]int, 0)相同。不过,您声称的区别并不存在。 -
@Flimzy
x := []int{}与make([]int, 0)相同的事实可以有效回答这个问题。这个事实没有在链接的问题中讨论。发布这个问题的答案并解释两者是相同的不是很好吗? -
@Volker 在此处查看 Go 规范:golang.org/ref/spec。如果您将其导出为 PDF,您将获得 84 页。它有超过25,000字。我不了解你,但我肯定无法在一小时内阅读 25,000 字的技术文档!
-
这是一个关于这个主题的好答案:stackoverflow.com/questions/29164375/…