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]
}

Loading

Facebook评论