《The.Go.Programming.Language.2015.11.pdf》之數組和切片

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

    • 1數組
      • 數組的聲明和初始化
      • 數群組成員的訪問
      • 數組的比較
      • 數組作為函數參數
    • 2切片
      • append函數
      • 利用append實現特殊函數

4.1數組

數組在go中很少使用,經常用到的是slice,這個後面再講

數組的聲明和初始化

var a [3]int //包含3個整數的數組var q [3]int = [3]int{1, 2, 3}var r [3]int = [3]int{1, 2}//[...]這樣的情況,數組長度由初始化的資料個數決定。q := [...]int{1, 2, 3} //數組長度為3

數群組成員的訪問

for i, v := range a {    fmt.Printf("%d %d\n", i, v)}

對於數組來說,數組長度也是數群組類型的一部分,所以[3]int和[4]int是不同的數群組類型。

定義常量,通過常量初始化數組

type Currency int    const (    USD Currency = iota    EUR    GBP    RMB)symbol := [...]string{USD: "$", EUR: "9", GBP: "!", RMB: "¥"}fmt.Println(RMB, symbol[RMB]) // "3 ¥"

數組的比較

如果數群組成員是可以比較的,那麼數組也可以比較

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

數組作為函數參數

在go語言中,數組作為參數傳遞,也是按值傳遞,會複製整個數組過去,非常低效,為了效率,可以傳遞數組的指標

    func zero(ptr *[32]byte) {        for i := range ptr {        ptr[i] = 0     }    }

4.2切片

切片表示長度可變的序列,裡面的元素都含有相同的類型。切片類型用[]T表示。
切片的主要作用是用來訪問數組的子序列。
切片含有三個成員:指標,長度,容量。指標指向數組的一個地址,長度表示切片包含的元素個數,容量表示切片最大可以包含的元素個數。
不同的切片可以指向同一個數組,甚至可以有重疊。

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

切片操作符 s[i:j],建立一個新的切片指向系列s的元素區間,從第i個到j-1個元素。這個序列s可以是數組,數組指標或者別的序列。如果去掉i,則預設為0,也就是從第一個元素開始,如果去掉j,預設胃len(s),也就是到最後一個元素。
切片包含指向數組的指標,在函數中可以利用切片在對數組進行修改。

func reverse(s []int) {    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {        s[i], s[j] = s[j], s[i]    }}a := [...]int{0, 1, 2, 3, 4, 5}reverse(a[:])fmt.Println(a) // "[5 4 3 2 1 0]"

翻轉數組可以通過三個逆序操作完成

s := []int{0, 1, 2, 3, 4, 5}// Rotate s left by two positions.reverse(s[:2])reverse(s[2:])reverse(s)fmt.Println(s) // "[2 3 4 5 0 1]"

可以通過s := []int{0, 1, 2, 3, 4, 5}產生切片,隱式建立一個合理長度的數組,然後建立切片指向它。
切片是不可比較的。

go語言中map類型的key需要值在整個生命週期中保持不變,但是切片不變,指向的數組也可能改變,所以切片不能夠作為key。
nil切片的長度和容量都為0,但是也存在非nil長度和容量為0的切片[]int{}make([]int, 3)[3:]

append函數

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

append函數在當前容量不夠的情況下,會申請2倍於之前的容量,把原來資料複製過去再添加。

利用append實現特殊函數

func remove(slice []int, i int) []int {    copy(slice[i:], slice[i+1:])    return slice[:len(slice)-1]}func main() {    s := []int{5, 6, 7, 8, 9}    fmt.Println(remove(s, 2)) // "[5 6 8 9]"}

不儲存順序

//d if we don’t need to preserve the order, we can just move the last element into the gap:func remove(slice []int, i int) []int {    slice[i] = slice[len(slice)-1]    return slice[:len(slice)-1]}func main() {    s := []int{5, 6, 7, 8, 9}    fmt.Println(remove(s, 2)) // "[5 6 9 8]}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.