**加注釋擼起來
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...