Go初體驗|基礎

niceforbear發表於2019-02-16

字串

GO的字串有點不一樣。它是UTF8字元的一個序列:當字元為一個ASCII碼時為一個位元組,其他字元則根據需要佔用2-4個位元組。

該做法的好處是:節省了記憶體和硬碟的儲存空間,同時,不需要像其它語言一樣對UTF8字符集的文字進行編碼和解碼。

GO通過雙引號"和反引號`來構建字串。

雙引號則會對文字進行解析,`則不會。

單個字元可以通過`來建立,一個單一字元可以用一個單一的rune型別來表示。

字串支援切片操作,但小心如果字串包含非ASCII字元,切片則要小心。因為切片操作是使用對字串的位元組進行索引的。這時可以使用range來代替切片操作:對字串的每一個字元進行操作。

字串處理相關的包:

  • fmt: 列印字串的格式

  • strings: 字串處理函式

  • strconv(將字串和其它型別資料進行轉換)

值, 指標, 引用

通常情況下,我們可以把一個GO變數當作他的值來使用。

其中有一些例外:通道、函式、方法、對映、切片都使用了引用,即儲存指標的變數。

GO中的指標操作符是: & 和 *

& 用於取地址
* 用於解引用,即獲取指標指向的值

package main

import (
    "fmt"
)

func swap1(x, y, p *int){
    if *x > *y {
        *x, *y = *y, *x
    }
    *p = *x * *y
}

func swap2(x, y int)(int, int, int){
    if x > y {
        x, y = y, x
    }
    return x, y, x*y
}

func main(){
    i := 9
    j := 5
    product := 0
    swap1(&i, &j, &product)
    fmt.Println(i, j, product)

    a := 63
    b := 64
    a, b, p := swap2(a, b)
    fmt.Println(a, b, p)
}

陣列

GO的陣列是一個定長的序列,元素型別相同。通過[]來構建索引。

構建語法

[length]Type
[N]Type{v1,v2,vN}
[]Type{}

陣列的長度是固定,不可修改的。可以通過len()來獲得陣列的長度,cap()獲得陣列的切片大小(不確定)。

陣列也有切片操作,也可以通過range進行索引訪問。

切片

GO的陣列是值傳遞,而切片是引用傳遞,因此效率更高。

建立切片

make([]Type, length, capacity)
make([]Type, length)
[]Type{}
[]Type{v1, v2, vN}

內建函式make來建立切片,對映和通道。

當建立一個切片時,首先會建立一個隱藏的初始化為零值的陣列,然後返回一個引用該隱藏陣列的切片。一個切片的容量(capacity)為隱藏陣列的長度。可以通過append來增加切片的容量。

未完待續

對映

參考

  1. https://www.shiyanlou.com/courses/runnin…