切片的遍歷和陣列一樣,也有兩種方式
1)for 迴圈常規方式遍歷
2)for-range 結構遍歷切片
兩種方式都在下面的**裡:
案例演示:
func main()
slice := arr[1:4] // 20, 30, 40
for i := 0; i < len(slice); i++
fmt.println()
//使用for--range 方式遍歷切片
for i, v := range slice
}切片初始化時 var slice = arr[startindex:endindex]
說明:從arr 陣列下標為startindex,取到下標為endindex的元素,不含arr[endindex]。
切片初始化時,仍然不能越界。範圍在 [0-len(arr)] 之間,但是可以動態增長。
1)var slice = arr[0:end] 可以簡寫 var slice = arr[:end]
2)var slice = arr[start:len(arr)] 可以簡寫: var slice = arr[start:]
3)var slice = arr[0:len(arr)] 可以簡寫: var slice = arr[:]
cap是乙個內建函式,用於統計切片的容量,即最大可以存放多少個元素。
切片定義完後,還不能使用,因為本身是乙個空的,需要讓其引用到乙個陣列,或者make乙個空間供切片來使用
切片可以繼續切片
func main()
fmt.println("slice3=", slice3)
}2)go底層會建立乙個新的陣列newarr(按照擴容後大小)
3)將slice原來包含的元素拷貝到新的陣列newarr
4)slice重新引用到newarr
5)注意newarr是在底層來維護的,程式設計師不可見
6)案例演示說明:
切片的拷貝操作:
切片使用copy內建函式完成拷貝,舉例說明:
func main()
var slice5 = make(int, 10)
copy(slice5, slice4)
fmt.println("slice4=", slice4)
fmt.println("slice5=", slice5)
}對上面**的說明:
(1)copy(para1, para2):引數的資料型別都是切片型別。
(2)按照上面的**來看,slice4和slice5的資料空間是獨立的,相互不影響,也就是說 slice4[0]=999,slice5[0] 仍然是1。
思考題:下面的**有沒有錯誤:
var a int = int
var slice = make(int, 1)
fmt.println(slice) //0
copy(slice, a) //這裡是不會報長度不夠這個錯的,雖然長度只有1。長度有多大,就拷貝幾個值過來
fmt.println(slice) //1
說明:上面的**沒有問題,可以執行,最後輸出的結果是
1)string底層是乙個byte陣列,因此string也可以進行切片處理
案例演示:
func main()
2)string和切片在記憶體的形態,以「abcd」 畫出記憶體示意圖
3)string是不可變的,也就說不能通過 str[0] = 'z' 方式來修改字串
4)如果需要修改字串,可以先將string -> byte / 或者 rune -> 修改 -> 重寫轉成string
func main()
陣列,切片和字典
1 陣列 array 陣列是乙個有相同資料型別的元素組成的固定長度的有序集合,如 var x 5 int,使用var定義的陣列,預設值如果整型為0,浮點型為0.0,字串為 物件為nil。求整型陣列之和,使用range函式,遍歷陣列 切片 字典時,返回索引和元素值 當對某個返回值不感興趣時,要用下劃線...
golang 陣列和切片
陣列和切片的建立func main output 1 0 ps 陣列宣告時,所有元素預設值都是0。一般很少這樣做,盡量自己初始化。func main output panic runtime error index out of range goroutine 1 running main.main...
Go 陣列和切片
陣列擷取 a 開始索引位置,結束索引 切片 slice 是本身並非動態陣列和陣列指標,通過內部指標指向底層陣列。建立乙個length和capacity都等於5的slice slice make int,5 length 3,capacity 5的slice slice make int,3,5 建立...