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

3 回复

不确定我的问题是否表述清楚了;顺便说一下,这两个例子对我来说都能正常工作,没有编译器问题。

对于第一个例子:尾随逗号(,)和不带尾随逗号(,)都能正常工作,没有问题;问题是:为什么要有尾随逗号(,)以及它的优势是什么?

对于第二个例子:这不是替换,而是初始化;我通过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语言中,切片字面量末尾的逗号是语法特性,主要有两个优势:

  1. 版本控制友好:在多行初始化时,添加/删除元素不会导致相邻行变更
  2. 自动格式化兼容: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
回到顶部