golang中陣列與切片的應用

2021-10-03 02:09:48 字數 4452 閱讀 6030

**加注釋擼起來

package main

/** * @description:陣列與切片

* @author: guai

* @date:2020/2/21 9:15

**/import

("fmt"

"math/rand"

"time"

)func

main()

fmt.

println

("雞的總重:"

, totalweight)

陣列定義和記憶體布局

//定義 var 陣列名 [陣列大小]資料型別

陣列在記憶體中的布局:

//1)陣列的位址可以通過陣列名來獲取 即&hens

//2)陣列的乙個元素的位址,就是陣列的首位址

//3)陣列的各個元素的位址間隔時依據陣列的型別決定,int64->8 int32->4...

fmt.

printf

("hens的位址=%p hens[0]的位址%p hens[1]的位址%p\n"

,&hens,

&hens[0]

,&hens[1]

)陣列初始化的方式

var numarr [3]

int=[3

]int

fmt.

println

("numarr:"

, numarr)

var numarr1 =[3

]int

fmt.

println

(numarr1)

var numarr2 =

[...

]int

fmt.

println

(numarr2)

//通過下標為指定陣列的指定位置賦值

var numarr4 =

[...

]int

fmt.

println

(numarr4)

陣列的遍歷

//for--range for index, val:=range arry

for_

, val :=

range strarr

陣列的應用

//通過循獲取乙個a-z的字元陣列並輸出

var varchars [26]

byte

for i :=

0; i <

len(varchars)

; i++

for i :=

0; i <

len(varchars)

; i++

fmt.

println()

//隨機生成五個數並反轉列印

var intvararr [5]

intlen

:=len

(intvararr)

//為使嘗產生的隨機數不相同需要設定隨機種子

rand.

seed

(time.

now().

unixnano()

)for i :=

0; i <

len; i++

fmt.

println

("交換前:"

, intvararr)

for i :=

0; i <

len/

2; i++

fmt.

println

("交換後:"

, intvararr)

//2、切片

當用陣列儲存一組個數不確定的資料時,可使用切片

//1)切片slice 是陣列的引用,因此切片是引用型別,

//2)切片的長度可以變化,是乙個動態變化陣列

//切片定義的基本語法: var 切片名 型別

//sliece從底層來說是乙個結構體(struct)

// type slice struct

切片的使用一

var intvararr1 [5]

int=

[...

]int

//定義切片,引用i那天vararr1陣列從0開始到4

slice := intvararr1[0:

5]fmt.

println

("切片的內容:"

, slice)

fmt.

println

("切片的容量;"

,cap

(slice)

)切片的使用二

//var 切片名 type =make(type ,len,[cap]) cap可選

//此方法建立的切片對應的陣列有make底層維護,對外不可見,即只能通過slice訪問各個元素

var floatslice [

]float64

=make([

]float64,10

) floatslice[1]

=10floatslice[9]

=10fmt.

println

("使用make建立slice:"

, floatslice,

" cap: "

,cap

(floatslice)

)切片的使用三

//定義切片直接指定具體陣列,使用原理類似make方式

var strslice [

]string=[

]string

fmt.

println

("strslice="

, strslice)

fmt.

println

("strslice cap="

,cap

(strslice)

)切片可以繼續切片

var intvararr2 =

[...

]int

slice1 := intvararr2[0:

3]slice2 := slice1[0:

3]fmt.

println

("切片的切片:"

, slice2)

//底層原理分析

//go底層會建立乙個新的陣列newarr(大小為擴容後陣列的大小)

//將slice原來包含的元素拷貝到新的陣列newarr

//最後slice重新引用新的陣列

var slice3 [

]int=[

]int

fmt.

println

("slice的動態追加:"

, slice3,

" cap:"

,cap

(slice3)

) slice3 =

(slice3,1,

2,3)

fmt.

println

("slice的動態追加:"

, slice3,

" cap:"

,cap

(slice3)

)切片的拷貝操作

//切片使用copy內建函式完成copy

//當目標slic的長度小於源slice的長度時,只copy目標長度的內容

//如 下:

var slice4 [

]int=[

]int

//只copyslice中的前兩個元素

var slice5 =

make([

]int,2

)copy

(slice5, slice4)

slice5[0]

=0fmt.

println

("切片的copy:slice4:"

, slice4,

" slice5"

, slice5)

//若直接使用賦值符號:

slice5 = slice4

slice5[0]

=0fmt.

println

("切片的直接複製:slice4:"

, slice4,

" slice5"

, slice5)

//通過對比結果會發現,使用賦值符號是,時將slice5指向slice4指向的記憶體,當修改slice5時修改的時它們公用的記憶體

//而copy則是為slice5開闢了新的記憶體空間然後將slice4的值copy到新的記憶體空間中

//3、string和slice

//string底層是乙個byte陣列,因此string也可以進行切片處理

//[:]表示下標從0開始到最後

//[a:] 表示從a開始到最後

//[:a]從0開始到a

str :=

"hello world!"

slice6 := str[:]

fmt.

println

("slice6:"

, slice6)

}

GoLang 陣列與切片

陣列是具有相同唯一型別的一組已編號且長度固定的資料項序列 這是一種同構的資料結構 這種型別可以是任意的原始型別例如整型 字串或者自定義型別。陣列長度必須是乙個常量表示式,並且必須是乙個非負整數。陣列長度也是陣列型別的一部分,所以 5 int和 10 int是屬於不同型別的。一維陣列宣告以及初始化常見...

golang陣列,切片

陣列 同一種資料型別的固定長度序列 陣列的定義 var a len int 比如 var a 5 int 長度是陣列型別的一部分,因此,var a 5 int 和 var a 10 int 是不同的型別 陣列的初始化 func chushi var age1 5 int var age2 int v...

golang中陣列和切片的區別與聯絡

golang中陣列和切片的區別 切片時指標型別,陣列是值型別 陣列的長度是固定的,而切片不是 切片是動態的陣列 切片比陣列多乙個屬性 容量 cap 切片的底層是陣列 既然乙個是指標型別,乙個是值型別,那麼區別體現在 呢?看下這個例子 numbers int for i,e range numbers...