字串
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
來增加切片的容量。
未完待續
對映
參考