Golang數組和切片的區別
簡述
golang數組和切片的區別
- 聲明方式不同,數組需要指定大小,而切片不用
- 數組是值傳遞,切片是引用傳遞
demo
package main
import "fmt"
func main() {
fmt.Println("--------------------數組聲明與賦值-----------------")
// 指定數組大小
var a1 [5]int
// 自動推斷數組大小
a2 := [...]int{1, 2, 3}
fmt.Println("a1=",a1,"a2=",a2)
// 按索引賦值
a3 := [...]int{2: 2, 4: 4}
fmt.Println("a3=",a3)
// 按索引賦值
a4 := [6]int{2: 2, 4: 4}
fmt.Println("a4=",a4)
fmt.Println("-------------------- 切片聲明與初始化-----------------")
// 定義切片
var b1 []int
fmt.Println("b1=",b1)
// 初始化
b2 := make([]int, 3, 5)
fmt.Printf("b2=%v,len=%d,cap=%d\n", b2, len(b2), cap(b2))
fmt.Println("--------------------值傳遞與引用傳遞-----------------")
a := [4]float64{67.7,89.9,21,78}
b := []int{2,3,5}
fmt.Printf("變量a---地址:%p,類型:%T,數值:%v,長度:%d \n",&a,a,a,len(a))
fmt.Printf("變量b---地址:%p,類型:%T,數值:%v,長度:%d \n",&b,b,b,len(b))
c := a
d := b
fmt.Printf("變量c---地址:%p,類型:%T,數值:%v,長度:%d \n",&c,c,c,len(c))
fmt.Printf("變量d---地址:%p,類型:%T,數值:%v,長度:%d \n",&d,d,d,len(d))
a[1] = 200
fmt.Println("a=",a,"c=",c)
d[0] = 200
fmt.Println("b=",b,"d=",d)
}
輸出
--------------------數組聲明與賦值-----------------
a1= [0 0 0 0 0] a2= [1 2 3]
a3= [0 0 2 0 4]
a4= [0 0 2 0 4 0]
-------------------- 切片聲明與初始化-----------------
b1= []
b2=[0 0 0],len=3,cap=5
--------------------值傳遞與引用傳遞-----------------
變量a---地址:0xc00008c040,類型:[4]float64,數值:[67.7 89.9 21 78],長度:4
變量b---地址:0xc00007c040,類型:[]int,數值:[2 3 5],長度:3
變量c---地址:0xc00008c0c0,類型:[4]float64,數值:[67.7 89.9 21 78],長度:4
變量d---地址:0xc00007c0a0,類型:[]int,數值:[2 3 5],長度:3
a= [67.7 200 21 78] c= [67.7 89.9 21 78]
b= [200 3 5] d= [200 3 5]
分析
a和c之間是值傳遞,相當於復制了一份,所以改變a中的值,c不會受到影響
b和d之間是引用傳遞,指向的是同一個,所以改變了d中的值,b也被改變了