20. slice 繼續

slice是一個序列的值,可以根據序列號來訪問??梢允褂?len(s) 返回 slice s 的長度。
寫一個例子,利用 for 循環,打印出 slice 的每一個值。利用下標來訪問每一個值。

package main

import (
    "fmt"
)

func main() {
    s := []int{1,1,2,3,5,8,13,21,34}
    fmt.Println("slice s is", s)
    for i := 0; i < len(s); i++ {
        fmt.Printf("s[%d] == %d\n", i, s[i])
    }
}

運行結果

slice s is [1 1 2 3 5 8 13 21 34]
s[0] == 1
s[1] == 1
s[2] == 2
s[3] == 3
s[4] == 5
s[5] == 8
s[6] == 13
s[7] == 21
s[8] == 34

slice的構成元素可以是任何類型,甚至也可以是其他slice。
比如:

game := [][]string{
        []string{"_","_","_"},
        []string{"_","_","_"},
        []string{"_","_","_"},
        []string{"_","_","_"},
        []string{"_","_","_"},

    }

slice game的元素類型是 []string 的slice。
請看完整代碼

package main

import (
    "fmt"
    "strings"
)

func main() {
    //填字游戲
    game := [][]string{
        []string{"_","_","_"},
        []string{"_","_","_"},
        []string{"_","_","_"},
        []string{"_","_","_"},
        []string{"_","_","_"},

    }
    //玩家填寫的內容
    game[0][0] = "X"
    game[0][1] = "X"
    game[0][2] = "X"

    game[1][0] = "Y"
    game[1][1] = "Y"
    game[1][2] = "Y"

    game[2][0] = "Z"
    game[2][1] = "Z"
    game[2][2] = "Z"

    printGame(game)
}

func printGame(game [][]string)  {
    for i := 0; i < len(game); i++ {
        fmt.Printf("%s\n", strings.Join(game[i], "  "))
    }
}

運行看看結果

X   X   X
Y   Y   Y
Z   Z   Z
_   _   _
_   _   _

任何一個slice都是對數組的一個切片后的使用。而且,它不影響原數組的值。
slice也可以重新切片。
像這樣

package main

import (
    "fmt"
)

func main() {
    s := []int{1,1,2,3,5,8,13,21,34,55}
    fmt.Println("s ==", s)
    fmt.Println("s[1:4] ==", s[1:4])
    fmt.Println("s[2:5] ==", s[2:5])

    //省略的寫法, : 符號左邊省略,表示從0開始
    fmt.Println("s[:3] ==", s[:3])
    //省略的寫法, : 符號右邊省略,表示到最后一個元素
    fmt.Println("s[4:] ==", s[4:])
}

重新切片的切面,注意省略的寫法。

s == [1 1 2 3 5 8 13 21 34 55]
s[1:4] == [1 2 3]
s[2:5] == [2 3 5]
s[:3] == [1 1 2]
s[4:] == [5 8 13 21 34 55]

可以看到,此例中的多個slice都是針對同一個數組在操作。切片的切片的表達式是 s[lo:hi] 。
我們可以看到,hi 是不包含在新的slice內的。
所以,s[lo:lo] 是空的,而 s[lo:lo + 1] 有一個元素。

使用 make 創建 slice 的時候,可以使用第三個參數,指定容量。
容量用 cap() 表示。
b := make([]int, 0, 5) //創建一個slice,長度為0,容量為5
b = b[:cap(b)] //b的長度為5,容量為5
b = b[1:] //b的長度為4,容量為4
用一個列子,看一下slice容量的變化。

package main

import (
    "fmt"
)

func main() {
    a := make([]int, 5)
    printSlice("a", a)

    b := make([]int, 0, 5)
    printSlice("b", b)

    c := b[:2]
    printSlice("c", c)

    d := c[2:5]
    printSlice("d", d)

}
func printSlice(s string, x []int)  {
    fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x)
}

運行結果

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0]
d len=3 cap=3 [0 0 0]

新聲明的 slice 如果沒有賦值的話,它的零值是 nil 。長度和容量都是 0 。
以下代碼可證

package main

import (
    "fmt"
)

func main() {
    var z []int
    fmt.Println(z, len(z), cap(z))
    if z == nil {
        fmt.Println("nil !")
    }
}

運行結果

[] 0 0
nil !
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容

  • Go 語言中,slice表示一個擁有相同類型元素的可變長度序列。slice通常被寫為[]T,其中元素的類型都是T;...
    副班長國偉閱讀 1,577評論 0 1
  • 語言介紹 Go(又稱Golang)是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言...
    hewolf閱讀 1,263評論 0 0
  • 切片(slice)是 Golang 中一種比較特殊的數據結構,這種數據結構更便于使用和管理數據集合。切片是圍繞動態...
    小孩真笨閱讀 1,106評論 0 1
  • Slice常見操作及底層原理實現 一 什么是Slice slice(切片)是一種數組結構,相當于是一個動態的數組,...
    假程序員的世界閱讀 5,295評論 0 4
  • 1. 單行文本省略問題 大致是有一個 main 容器是 flex 布局,左邊一個 logo 固定寬高,右邊 con...
    點_ba7a閱讀 296評論 0 0