Golang中切片末尾添加逗号的优势探讨
Golang中切片末尾添加逗号的优势探讨 你好,从下面的代码中,为什么最后一个逗号有优势?字符串被赋值时,无论带不带它都不会抛出错误;我没发现它有任何用处。请帮我理解一下。
usa:=make([]string,5,5)
usa=[]string{` Alabama`, ` Alaska`, ` Arizona`, ` Arkansas`, ` California`,}
//usa=[]string{` Alabama`, ` Alaska`, ` Arizona`, ` Arkansas`, ` California`}
fmt.Println(usa)
fmt.Println(len(usa))
fmt.Println(cap(usa))
另外,下面这个例子是我刚开始创建了一个容量为5的切片,但为什么在初始赋值时允许超过5个元素呢?
usa:=make([]string,5,5)
usa=[]string{` Alabama`, ` Alaska`, ` Arizona`, ` Arkansas`, ` California`, ` Colorado`, ` Connecticut`, ` Delaware`, ` Florida`, ` Georgia`, ` Hawaii`, ` Idaho`, ` Illinois`, ` Indiana`, ` Iowa`, ` Kansas`, ` Kentucky`, ` Louisiana`, ` Maine`, ` Maryland`, ` Massachusetts`, ` Michigan`, ` Minnesota`, ` Mississippi`, ` Missouri`, ` Montana`, ` Nebraska`, ` Nevada`, ` New Hampshire`, ` New Jersey`, ` New Mexico`, ` New York`, ` North Carolina`, ` North Dakota`, ` Ohio`, ` Oklahoma`, ` Oregon`, ` Pennsylvania`, ` Rhode Island`, ` South Carolina`, ` South Dakota`, ` Tennessee`, ` Texas`, ` Utah`, ` Vermont`, ` Virginia`, ` Washington`, ` West Virginia`, ` Wisconsin`, ` Wyoming`}
fmt.Println(usa)
fmt.Println(len(usa))
fmt.Println(cap(usa))
更多关于Golang中切片末尾添加逗号的优势探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html
不确定我的问题是否表述清楚了;顺便说一下,这两个例子对我来说都能正常工作,没有编译器问题。
对于第一个例子:带尾随逗号(,)和不带尾随逗号(,)都能正常工作,没有问题;问题是:为什么要有尾随逗号(,)以及它的优势是什么?
对于第二个例子:这不是替换,而是初始化;我通过make创建了一个当前容量为5且最大容量也为5的切片“usa”。这就是make切片的意图,对吧!如果是这样,为什么以及如何在初始化时允许放入50个值;这基本上超过了最大容量。
更多关于Golang中切片末尾添加逗号的优势探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
SubbaReddy_Jangalapa:
usa:=make([]string,5,5) usa=[]string{ ` Alabama` , ` Alaska` , ` Arizona` , ` Arkansas` , ` California` ,} //usa=[]string{ ` Alabama` , ` Alaska` , ` Arizona` , ` Arkansas` , ` California` } fmt.Println(usa) fmt.Println(len(usa)) fmt.Println(cap(usa))
末尾的逗号允许你将元素跨越多行书写。 因此,以下代码无法编译:Go Playground - The Go Programming Language
在你的第二个例子中,你用另一个同类型的值替换了变量“usa”的值。两个值都是切片,所以这样做是安全的。第二种情况中使用的字符串初始化是其他几行代码的简写形式。
在Go语言中,切片字面量末尾的逗号是语法特性,主要有两个优势:
- 版本控制友好:在多行初始化时,添加/删除元素不会导致相邻行变更
- 自动格式化兼容:go fmt等工具会自动处理这种格式
示例:
// 添加新元素时,只需新增一行,不会修改其他行
states := []string{
"Alabama",
"Alaska",
"Arizona", // 添加新元素只需在此新增一行
}
关于容量问题,make([]string,5,5)创建的是长度为5、容量为5的切片,但随后的完整赋值[]string{...}会创建全新的切片,完全替换原来的切片。新切片的容量由编译器根据元素数量自动决定,与之前的make调用无关。
实际执行过程:
usa := make([]string,5,5) // 创建切片A
usa = []string{...} // 创建切片B,并替换usa的引用
如果要在原切片基础上操作,应该使用append:
usa := make([]string, 0, 5)
usa = append(usa, "Alabama", "Alaska", "Arizona", "Arkansas", "California")
// 此时长度=5,容量=5

