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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM