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切片不是动态数组 - Applied Go

Go切片基于一个巧妙的概念,不容忽视

在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代码交互的场景。

回到顶部