1. 程式人生 > 實用技巧 >Mastering Go 程式基本結構體

Mastering Go 程式基本結構體

Chapter3

for-loop

  1. 允許指定迭代次數

  2. 陣列、切片、對映、字串

形式1

for i := 0; i < 10; i++ {

}

注意

  1. i是一個本地臨時變數,迴圈結束就會"消失"

  2. break 退出迴圈

  3. continue 跳出當次迴圈,進行下一次迴圈判斷

形式2

// while
for condition {

}

// forever-loop
for {

}

// do-while
for ok := true; ok; ok = someExpression {

}

形式3

  1. 不需要知道長度

  2. 返回值中有索引

for k, v := range collection {

}

Slice

  1. 切片的底層是陣列, 不需要指定長度

  2. 切片作為函式引數傳遞是傳遞引用(雖然函式是值傳遞,Copy切片的地址)

  3. 切片的零值是nil

宣告

s := []int{1, 2, 3, 3}
s := make([]int, 20)

注意:自動初始化為型別的零值

make

注意:自動初始化為型別的零值

s := make([]int, 20)

appned

注意:nil的切片是可以append的

s := make([]int, 20)
s = append(s, 1)
log.Println(s)
s = append(s, []int{1, 2, 3}...)
log.Println(s)

subSlice

  1. 獲取同一個切片或者陣列的sub時,共享同樣的底層陣列

  2. 返回的切片指向底層陣列

s[1:3]

len and cap

len獲取元素個數、cap獲取切片容量

len(s)
cap(s)

位元組切片

bs := make([]byte, 1024)
a := []int{1, 2, 3, 4, 5, 6}
b := []int{7, 8, 9, 10}
copy(a, b)
log.Println(a)
log.Println(b)

copy

a := []int{1, 2, 3, 4, 5, 6}
b := []int{7, 8, 9, 10}
copy(a, b)
log.Println(a)
log.Println(b)

sort

sort.Slice(s, func(i, j int) bool {
return s[i] > s[j]
})

Map

nil Map 無法操作

var m map[string]string
log.Println(m)
m["key"] = "value" // panic: assignment to entry in nil map

const

  1. 常量值無法改變、數字、字串、布林

  2. 通常是全域性變數,不使用也不會報錯

  3. 常量定義無須宣告型別,編譯器自動判斷

  4. 常量最好定義到一個包中

const VERSION = "1.15.5"

iota

  1. 每定義一個常量,iota+1

  2. 遇到定義一個const,iota重置0

  3. iota是int型別可以參與運算

const (
zaro = iota
one
two
three
)
const (
B = 1 << (iota * 10)
KB
MB
GB
)

const (
a = iota
_ // 跳過宣告
c
_
e
)

Pointer

  1. 指標即是地址

  2. &獲取非指標變數的地址

  3. * 獲取指標的值,也稱為指標的解引用

  4. 指標可以作為引數也可以作為返回值

Time and Date

  1. 基本操作

t := time.Now()
log.Println(t.Weekday(), t.Year(), t.Month(), t.Day())
log.Println(t.Unix()) // unix時間是1970