濮阳杆衣贸易有限公司

主頁 > 知識庫 > 簡單聊一聊Go語言中的數(shù)組和切片

簡單聊一聊Go語言中的數(shù)組和切片

熱門標簽:400手機電話免費辦理 上海企業(yè)外呼系統(tǒng)排名 武漢百應人工智能電銷機器人 電腦外呼系統(tǒng)輻射大嗎 開通400電話申請流程 智能語音電銷的機器人 百度地圖標注位置網(wǎng)站 如何利用高德地圖標注家 揚州電銷外呼系統(tǒng)軟件

1. 數(shù)組

數(shù)組是一個由固定長度的特定類型元素組成的序列,一個數(shù)組可以由零個或多個元素組成。因為數(shù)組的長度是固定的,因此在 Go 語言中很少直接使用數(shù)組。和數(shù)組對應的類型是 Slice(切片),它是可以增長和收縮的動態(tài)序列,slice 功能也更靈活。

數(shù)組的每個元素可以通過索引下標來訪問,索引下標的范圍是從 0 開始到數(shù)組長度減 1 的位置。內置的 len 函數(shù)將返回數(shù)組中元素的個數(shù)。

var a [3]int             // array of 3 integers
fmt.Println(a[0])        // print the first element
fmt.Println(a[len(a)-1]) // print the last element, a[2]

默認情況下,數(shù)組的每個元素都被初始化為元素類型對應的零值,對于數(shù)字類型來說就是 0。

var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"

如果在數(shù)組的長度位置出現(xiàn)的是“...”省略號,則表示數(shù)組的長度是根據(jù)初始化值的個數(shù)來計算。因此,上面 q 數(shù)組的定義可以簡化為:

q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"

數(shù)組的長度是數(shù)組類型的一個組成部分,因此[3]int 和[4]int 是兩種不同的數(shù)組類型。

數(shù)組的長度必須是常量表達式,因為數(shù)組的長度需要在編譯階段確定。

q := [3]int{1, 2, 3}
q = [4]int{1, 2, 3, 4} // compile error: cannot assign [4]int to [3]int

如果一個數(shù)組的元素類型是可以相互比較的,那么數(shù)組類型也是可以相互比較的,這時候我們可以直接通過==比較運算符來比較兩個數(shù)組,只有當兩個數(shù)組的所有元素都是相等的時候數(shù)組才是相等的。不相等比較運算符!=遵循同樣的規(guī)則。

a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // compile error: cannot compare [2]int == [3]int

2. 切片(Slice)

Slice(切片)代表變長的序列,序列中每個元素都有相同的類型。一個 slice 類型一般寫作[]T,其中 T 代表 slice 中元素的類型;slice 的語法和數(shù)組很像,只是沒有固定長度而已。

一個 slice 是一個輕量級的數(shù)據(jù)結構,提供了訪問數(shù)組子序列(或者全部)元素的功能,而且 slice 的底層確實引用一個數(shù)組對象。

一個 slice 由三個部分構成:指針、長度和容量。

  • 指針指向第一個 slice 元素對應的底層數(shù)組元素的地址,要注意的是 slice 的第一個元素并不一定就是數(shù)組的第一個元素。
  • 長度對應 slice 中元素的數(shù)目;
  • 長度不能超過容量,容量一般是從 slice 的開始位置到底層數(shù)據(jù)的結尾位置。內置的 len 和 cap 函數(shù)分別返回 slice 的長度和容量。

表示一年中每個月份名字的字符串數(shù)組,還有重疊引用了該數(shù)組的兩個 slice。數(shù)組這樣定義:

months := [...]string{1: "January", /* ... */, 12: "December"}

因此一月份是 months[1],十二月份是 months[12]。

通常,數(shù)組的第一個元素從索引 0 開始,但是月份一般是從 1 開始的,因此我們聲明數(shù)組時直接跳過第 0 個元素,第 0 個元素會被自動初始化為空字符串。

slice 的切片操作 s[i:j],其中 0 ≤ i≤ j≤ cap(s),用于創(chuàng)建一個新的 slice,引用 s 的從第 i 個元素開始到第 j-1 個元素的子序列。新的 slice 將只有 j-i 個元素。如果 i 位置的索引被省略的話將使用 0 代替,如果 j 位置的索引被省略的話將使用 len(s)代替。因此,months[1:13]切片操作將引用全部有效的月份,和 months[1:]操作等價;months[:]切片操作則是引用整個數(shù)組。讓我們分別定義表示第二季度和北方夏天月份的 slice,它們有重疊部分:

Q2 := months[4:7]
summer := months[6:9]
fmt.Println(Q2)     // ["April" "May" "June"]
fmt.Println(summer) // ["June" "July" "August"]

兩個 slice 都包含了六月份。

append 函數(shù)

append 函數(shù)用于向 slice 追加元素:

var runes []rune
for _, r := range "Hello, 世界" {
    runes = append(runes, r)
}
fmt.Printf("%q\n", runes) // "['H' 'e' 'l' 'l' 'o' ',' ' ' '世' '界']"

為了提高內存使用效率,新分配的數(shù)組一般略大于保存 x 和 y 所需要的最低大小。通過在每次擴展數(shù)組時直接將長度翻倍從而避免了多次內存分配,也確保了添加單個元素操作的平均時間是一個常數(shù)時間。這個程序演示了效果:

func main() {
    var x, y []int
    for i := 0; i  10; i++ {
        y = appendInt(x, i)
        fmt.Printf("%d cap=%d\t%v\n", i, cap(y), y)
        x = y
    }
}

//每一次容量的變化都會導致重新分配內存和copy操作:
0  cap=1    [0]
1  cap=2    [0 1]
2  cap=4    [0 1 2]
3  cap=4    [0 1 2 3]
4  cap=8    [0 1 2 3 4]
5  cap=8    [0 1 2 3 4 5]
6  cap=8    [0 1 2 3 4 5 6]
7  cap=8    [0 1 2 3 4 5 6 7]
8  cap=16   [0 1 2 3 4 5 6 7 8]
9  cap=16   [0 1 2 3 4 5 6 7 8 9]

讓我們仔細查看 i=3 次的迭代。當時 x 包含了[0 1 2]三個元素,但是容量是 4,因此可以簡單將新的元素添加到末尾,不需要新的內存分配。然后新的 y 的長度和容量都是 4,并且和 x 引用著相同的底層數(shù)組,如圖 4.2 所示。

在下一次迭代時 i=4,現(xiàn)在沒有新的空余的空間了,因此 appendInt 函數(shù)分配一個容量為 8 的底層數(shù)組,將 x 的 4 個元素[0 1 2 3]復制到新空間的開頭,然后添加新的元素 i,新元素的值是 4。新的 y 的長度是 5,容量是 8;后面有 3 個空閑的位置,三次迭代都不需要分配新的空間。當前迭代中,y 和 x 是對應不同底層數(shù)組的 view。這次操作如圖 4.3 所示。

內置的 append 函數(shù)可能使用比 appendInt 更復雜的內存擴展策略。

因此,通常我們并不知道 append 調用是否導致了內存的重新分配,因此我們也不能確認新的 slice 和原始的 slice 是否引用的是相同的底層數(shù)組空間。

同樣,我們不能確認在原先的 slice 上的操作是否會影響到新的 slice。

總結

到此這篇關于Go語言中數(shù)組和切片的文章就介紹到這了,更多相關Go語言數(shù)組和切片內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • go特性之數(shù)組與切片的問題
  • 深入理解Go語言中的數(shù)組和切片
  • GO語言數(shù)組和切片實例詳解
  • 理解Golang中的數(shù)組(array)、切片(slice)和map
  • 淺談Go數(shù)組比切片好在哪

標簽:黑龍江 宜賓 武漢 江西 張掖 新余 嘉峪關 延邊

巨人網(wǎng)絡通訊聲明:本文標題《簡單聊一聊Go語言中的數(shù)組和切片》,本文關鍵詞  簡單,聊,一聊,語言,中的,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《簡單聊一聊Go語言中的數(shù)組和切片》相關的同類信息!
  • 本頁收集關于簡單聊一聊Go語言中的數(shù)組和切片的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    静乐县| 闻喜县| 敦化市| 张家川| 鄢陵县| 墨竹工卡县| 佛坪县| 永德县| 乌苏市| 岳池县| 鲜城| 柳州市| 阿拉善盟| 临沧市| 灵石县| 大港区| 新郑市| 邵阳县| 漳平市| 临沂市| 渑池县| 富源县| 讷河市| 江孜县| 郓城县| 金秀| 定襄县| 拉孜县| 定安县| 广宗县| 汝南县| 开远市| 拉孜县| 武强县| 科技| 崇文区| 长春市| 磐石市| 米林县| 呼伦贝尔市| 肃南|