Golang数组和切片的区别

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也被改变了

原文地址:https://www.cnblogs.com/Kingram/p/12764583.html