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
", 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
",&a,a,a,len(a))
fmt.Printf("变量b---地址:%p,类型:%T,数值:%v,长度:%d
",&b,b,b,len(b))
c := a
d := b
fmt.Printf("变量c---地址:%p,类型:%T,数值:%v,长度:%d
",&c,c,c,len(c))
fmt.Printf("变量d---地址:%p,类型:%T,数值:%v,长度:%d
",&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也被改变了