Golang中[]int和[...]int的区别解析
Golang中[]int和[…]int的区别解析
a:=[]int{10, 20}
fmt.Println(a)
和
a:=[...]int{10, 20}
fmt.Println(a)
两者都能正常工作并产生相同的输出
它们之间有什么区别吗?
5 回复
我是Go语言的新手,能否请你通过一个示例来详细说明…
更多关于Golang中[]int和[...]int的区别解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我也是新手。但在第二种情况下,你不能直接向数组添加新元素
a=append(a,11)
fmt.Println(a)
在Go语言中,[]int和[...]int确实有本质的区别,这涉及到Go语言中切片(slice)和数组(array)的核心概念。
主要区别
1. 数据类型不同
[]int{10, 20}创建的是切片(slice)[...]int{10, 20}创建的是数组(array)
2. 长度特性
package main
import "fmt"
func main() {
// 切片 - 长度可变
slice := []int{10, 20}
fmt.Printf("切片长度: %d\n", len(slice)) // 切片长度: 2
// 数组 - 长度固定
array := [...]int{10, 20}
fmt.Printf("数组长度: %d\n", len(array)) // 数组长度: 2
}
3. 内存分配和传递行为
package main
import "fmt"
func modifySlice(s []int) {
s[0] = 100
}
func modifyArray(a [2]int) {
a[0] = 100
}
func main() {
slice := []int{10, 20}
array := [...]int{10, 20}
modifySlice(slice)
modifyArray(array)
fmt.Println("修改后的切片:", slice) // [100 20]
fmt.Println("修改后的数组:", array) // [10 20] - 未改变
}
4. 容量和动态扩展
package main
import "fmt"
func main() {
// 切片可以动态扩展
slice := []int{10, 20}
slice = append(slice, 30, 40)
fmt.Println("扩展后的切片:", slice) // [10 20 30 40]
// 数组长度固定,无法扩展
array := [...]int{10, 20}
// array = append(array, 30) // 编译错误
fmt.Println("数组:", array) // [10 20]
}
5. 类型系统差异
package main
import "fmt"
func processSlice(s []int) {
fmt.Println("处理切片:", s)
}
func processArray(a [2]int) {
fmt.Println("处理数组:", a)
}
func main() {
slice1 := []int{10, 20}
slice2 := []int{10, 20, 30}
array1 := [...]int{10, 20}
array2 := [...]int{10, 20, 30} // 这是不同的类型 [3]int
processSlice(slice1)
processSlice(slice2)
processArray(array1)
// processArray(array2) // 编译错误,类型不匹配 [3]int vs [2]int
}
关键总结
- 切片(
[]int):引用类型,动态长度,传递时传递引用 - 数组(
[...]int):值类型,固定长度,传递时传递副本
在实际开发中,切片的使用频率远高于数组,因为切片提供了更大的灵活性。数组主要用于需要精确控制内存布局或与C代码交互的场景。


