Go內部培訓 節點解析21 30

2021-09-04 10:55:01 字數 4282 閱讀 2259

21. go 並行通道channel

package main

import

"fmt"

func

main()

()// 使用`<-channel`語法來從channel讀取資料

// 這裡我們從main函式所在的協程來讀取剛剛寫入

// messages通道的資料

msg :=

<-messages

fmt.

println

(msg)

}

22. go常量
package main

import

"fmt"

import

"math"

// "const" 關鍵字用來定義常量

const s string

="constant"

func

main()

23. go 超時
package main

import

"time"

import

"fmt"

func

main()

()// 這裡使用select來實現超時,`res := <-c1`等待通道結果,

// `<- time.after`則在等待1秒後返回乙個值,因為select首先

// 執行那些不再阻塞的case,所以這裡會執行超時程式,如果

// `res := <-c1`超過1秒沒有執行的話

select

// 如果我們將超時時間設為3秒,這個時候`res := <-c2`將在

// 超時case之前執行,從而能夠輸出寫入通道c2的值

c2 :=

make

(chan

string,1

)gofunc()

()select

}

24. go 錯誤處理
package main

import

"errors"

import

"fmt"

// go語言裡面約定錯誤**是函式的最後乙個返回值,

// 並且型別是error,這是乙個內建的介面

func

f1(arg int)(

int,

error

)// 返回錯誤為nil表示沒有錯誤

return arg +3,

nil}

// 你可以通過實現error介面的方法error()來自定義錯誤

// 下面我們自定義乙個錯誤型別來表示上面例子中的引數錯誤

type argerror struct

func

(e *argerror)

error()

string

func

f2(arg int)(

int,

error)}

return arg +3,

nil}

func

main()

else

}for

_, i :=

range

intelse

}// 如果你需要使用自定義錯誤型別返回的錯誤資料,你需要使用型別斷言

// 來獲得乙個自定義錯誤型別的例項才行。

_, e :=f2(

42)if ae, ok := e.

(*argerror)

; ok

}

25. go 打點器
package main

import

"time"

import

"fmt"

func

main()

}()// ticker和timer一樣可以被停止。一旦ticker停止後,通道將不再

// 接收資料,這裡我們將在1500毫秒之後停止

time.

sleep

(time.millisecond *

1500

)ticker.

stop()

fmt.

println

("ticker stopped"

)}

26. go 遞迴函式
package main

import

"fmt"

// fact函式不斷地呼叫自身,直到達到基本狀態fact(0)

func

fact

(n int

)int

return n *

fact

(n-1)}

func

main()

}func

main()

28. go 方法
package main

import

"fmt"

type rect struct

// 這個area方法有乙個限定型別*rect,

// 表示這個函式是定義在rect結構體上的方法

func

(r *rect)

area()

int// 方法的定義限定型別可以為結構體型別

// 也可以是結構體指標型別

// 區別在於如果限定型別是結構體指標型別

// 那麼在該方法內部可以修改結構體成員資訊

func

(r rect)

perim()

intfunc

main()

// 呼叫方法

fmt.

println

("area: "

, r.

area()

)fmt.

println

("perim:"

, r.

perim()

)// go語言會自動識別方法呼叫的引數是結構體變數還是

// 結構體指標,如果你要修改結構體內部成員值,那麼使用

// 結構體指標作為函式限定型別,也就是說引數若是結構體

//變數,僅僅會發生值拷貝。

rp :=

&rfmt.

println

("area: "

, rp.

area()

)fmt.

println

("perim:"

, rp.

perim()

)}

29. go 工作池
package main

import

"fmt"

import

"time"

// 我們將在worker函式裡面執行幾個並行例項,這個函式從jobs通道

// 裡面接受任務,然後把執行結果傳送到results通道。每個job我們

// 都休眠一會兒,來模擬乙個耗時任務。

func

worker

(id int

, jobs <-

chan

int, results chan

<-

int)

}func

main()

// 這裡我們傳送9個任務,然後關閉通道,告知任務傳送完成

for j :=

1; j <=

9; j++

close

(jobs)

// 然後我們從results裡面獲得結果

for a :=

1; a <=

9; a++

30. go 關閉通道
package main

import

"fmt"

// 在這個例子中,我們使用通道jobs在main函式所在的協程和乙個資料

// 接收端所在的協程通訊。當我們資料傳送完成後,我們關閉jobs通道

func

main()

else}}

()// 這裡向jobs通道寫入三個資料,然後關閉通道

for j :=

1; j <=

3; j++

close

(jobs)

fmt.

println

("sent all jobs"

)// 我們知道done通道在接收資料的時候會阻塞,所以在所有的資料傳送

// 接收完成後,寫入done的資料將在這裡被接收,然後程式結束。

<-done

}

Go內部培訓 節點解析11 20

11.go line filterspackage main import bufio fmt os strings func main 在 scan 過程中,檢查錯誤。檔案結束不會被當作乙個錯誤 if err scanner.err err nil 12.go panicpackage main ...

Go內部培訓 節點解析41 50

41.go 程序執行package main import syscall import os import os exec func main exec 函式需要乙個切片引數,我們給ls命令一些 常見的引數。注意,第乙個引數必須是程式名稱 args string exec 還需要一些環境變數,這裡...

Go內部培訓 節點解析61 63

61.go 訊號處理package main import fmt import os import os signal import syscall func main 程式將等待接受訊號,然後退出 fmt.println awaiting signal done fmt.println exit...