Golang – Array 和Slice的区别
Array
- 固定长度的,一旦定义了就无法再改动了
var arr [5]int // 定义一个长度为5的整型数组
- arr1 复制去arr2之后,arr2的任何更改就跟arr1完全没有任何关系了
arr1 := [3]int{1, 2, 3}
arr2 := arr1 // 复制 arr1 的内容到 arr2
arr2[0] = 10
fmt.Println(arr1) // 输出: [1 2 3]
fmt.Println(arr2) // 输出: [10 2 3]
- array在function这样的parameter传递,其实是复制variable
package main
import "fmt"
func modifyArray(arr [3]int) {
arr[0] = 100
}
func main() {
original := [3]int{1, 2, 3}
modifyArray(original)
fmt.Println(original) // 输出:[1 2 3]
}
Slice
- 动态的长度
var s []int // 定义一个整型切片
- 可以随意读取slice当中的一段
arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:3] // 引用 arr 的一部分
s2 := arr[2:4]
fmt.Println(s1) // 输出: [2 3]
fmt.Println(s2) // 输出: [3 4]
- 可以随意append扩容
s := []int{1, 2, 3}
s = append(s, 4, 5) // 扩容并追加新元素
fmt.Println(s) // 输出: [1 2 3 4 5]
- slice 是无法复制的,在代码看起来是复制,其实只是共用同一个variable地址而已,所以任何的更改都会印象到main variable
arr1 := []int{1, 2, 3}
arr2 := arr1 // 共享数据的memory地址
arr2[0] = 10
fmt.Println(arr1) // 输出: [10 2 3]
fmt.Println(arr2) // 输出: [10 2 3]
- slice在function这样的parameter传递,不是复制variable,而是在传送pointer,任何在function内对于slice的更改都会反应在main variable
package main
import "fmt"
func modifySlice(slc []int) {
slc[0] = 100
}
func main() {
original := []int{1, 2, 3}
modifySlice(original)
fmt.Println(original) // 输出:[100 2 3]
}
Facebook评论