深入解析Go語言程式設計中slice切片結構

2022-09-24 21:09:10 字數 2494 閱讀 9012

陣列轉換成切片

複製** **如下:

a := [10]int{}

fmt.println(a)

s1 := a[:10]  //取前10個元素 [5:]取 5-最後的元素

fmt.println(s1)

slice測試

複製** **如下:

a := byte

sa := a[2:5]

fmt.println(string(sa))

sd1 := a[3:5]

fmt.println(string(sd1)) //看看效果

我們看到這樣的是slice_a指向array_ori 其實是從c指向到k 我們用fmt.println(cap(slice_a)) 結果肯定不是3

自己動手試一下下邊這個

複製** **如下:

a := byte

sa := a[2:5]

fmt.println(string(sa))

s := sa[1:3]

fmt.println(string(s))

s2 := sa[3:5]

fmt.println(string(s2))

slice是指向底層的陣列,如果多個slice指向同乙個的時候,其中乙個改變了,其他的都改變。試一下下邊這個

複製** **如下:

a := int

s1 := a[2:5]

s2 := a[1:3]

fmt.println(s1, s2)

s1[0] = 9

程式設計客棧fmt.println(s1, s2)

切片是引用型別,即如果賦值切片給另乙個切片,它們都指向同一底層陣列。例如,如果某函式取切片參量,對其元素的改動會顯現在呼叫者中,類似於傳遞乙個底層陣列的指標。因此 read 函式可以接受切片參量,而不需指標和計數;切片的長度決定了可讀資料的上限。這裡是 os 包的 file 型的 read 方法的簽名:

複製** **如下:

func (file *file) read(buf byte) (n int, err os.error)

此方法返回讀入位元組數和可能的錯誤值。要讀入乙個大的緩衝 b 的首32位元組, 切片(動詞)緩衝。

複製** **如下:

n, err := f.read(buf[0:32])

這種切片常用且高效。實際上,先不管效率,此片段也可讀緩衝的首32位元組。www.cppcns.com

複製** **如下:

var n int

var err os.error

for i := 0; i < 32; i++

n += nbytes

}只要還在底層陣列的限制內,切片的長度可以改變,只需賦值自己。切片的容量,可用內部函式 cap 取得,給出此切片可用的最大長度。下面的函式給切片添值。如果資料超過容量,切片重新分配,返回結果切片。此函式利用了 len 和 c程式設計客棧ap 對 nil 切片合法、返回0的事實。

apppend的用法

複製** **如下:

a := make(int, 3, 6)

fmt.printf("%p", a)

a = append(a, 1, 2, 3)

fmt.printf("%v %p\n", a, a)

a = append(a, 1, 2, 3)

fmt.printf("%v %p\n", a, a)

我們必須返回切片,因為儘管 append 可以改變 slice 的元素, 切片自身(持有指標、長度和容量的執行態資料結構)是值傳遞的。新增切片的主意很有用,因此由內建函式 append 實現。

複製** **如下:

func append(slice, databyte) byte

slice = newslice

}slice = slice[0:l+len(data)]

for i, c := range data

return www.cppcns.comslice

}當slice中append追加的元素超過了指向的容量,就會重新指向乙個新的底層陣列,所以乙個底層陣列的改變,不會帶動其他的改變,試一下下邊的**

複製** **如下:

a := int

s1 := a[2:5]

s2 := a[1:3]

fmt.println(s1, s2)

s2 = append(s2, 1, 2, 2, 3, 3, 4, 5)

s1[0] = 9

fmt.println(s1, s2)

copy

這是乙個拷貝的函式,下邊的**是從s2拷貝到s1然後我們會看到結果是[7 8 9 4 5]

如果是copy(s2,s1) 我們看到的結果是[1 2 3]

複製** **如下:

s1 := int

s2 := int

copy(s1, s2)

fmt.println(s1)

本文標題: 深入解析go語言程式設計中slice切片結構

本文位址:

深入解析Go語言 (二)切片slice

我們都知道go中slice切片是不同於陣列的資料型別,他的亮點在在於它是引用型別,那麼它是如何實現引用的呢?首先我們先來明確一下他的結構,乙個slice是包含 3個域的結構體,分別是 指向slice中的第乙個元素的指標,slice的長度,以及slice的容量。區分一下長度和容量,長度是下表操作的上界...

深入剖析Go語言程式設計中switch語句的使用

switch語句可以讓乙個變數對反對值的列表平等進行測試。每個值被稱為乙個的情況 case 變數被接通檢查每個開關盒 switch case 在go程式設計,switch有兩種型別。表示式switch 在表示式switch,case包含相比較,switch表示式的值。型別switch 在這型別swi...

Go 語言程式設計

課程名稱 go 語言程式設計 課程時間 2014年7月30日 週三 20 50 22 00 課程安排 20 50 21 00 通過郵件位址登入網路課堂 21 00 22 00 主題演講 徐立 與qa ps 課程諮詢 入qq群 csdn技術交流 群號是303806405 課程名稱 go 語言程式設計 ...