Go內部培訓 節點解析41 50

2021-09-04 11:05:42 字數 4229 閱讀 2053

41. go 程序執行

package main

import

"syscall"

import

"os"

import

"os/exec"

func

main()

// `exec`函式需要乙個切片引數,我們給ls命令一些

// 常見的引數。注意,第乙個引數必須是程式名稱

args :=

string

// `exec`還需要一些環境變數,這裡我們提供當前的

// 系統環境

env := os.

environ()

// 這裡是`os.exec`呼叫。如果一切順利,我們的原

// 程序將終止,然後啟動乙個新的ls程序。如果有

// 錯誤發生,我們將獲得乙個返回值

execerr := syscall.

exec

(binary, args, env)

if execerr !=

nil}

42. go 經典hello world
package main

import

"fmt"

func

main()

43. go 可變長引數列表
package main

import

"fmt"

// 這個函式可以傳入任意數量的整型引數

func

sum(nums ...

int)

fmt.

println

(total)

}func

main()

sum(nums...

)}

44. go 命令列引數
package main

import

"os"

import

"fmt"

func

main()

45. go 命令列引數標記
package main

import

"flag"

import

"fmt"

func

main()

46. go 排序
package main

import

"fmt"

import

"sort"

func

main()

sort.

strings

(strs)

fmt.

println

("strings:"

, strs)

// 對於整型的排序

ints :=

intsort.

ints

(ints)

fmt.

println

("ints: "

, ints)

// 我們還可以檢測切片是否已經排序好

s := sort.

intsaresorted

(ints)

fmt.

println

("sorted: "

, s)

}

47. go 切片
package main

import

"fmt"

func

main()

fmt.

println

("dcl:"

, t)

// 我們也可以建立多維切片,和陣列不同的是,切片元素的長度也是可變的。

twod :=

make([

][]int,3

)for i :=

0; i <

3; i++

}fmt.

println

("2d: "

, twod)}}

package main

import

"fmt"

func

main()

func

test

(s [

]int

)package main

import

"fmt"

func

main()

func

test

(s [

]int)[

]int

package main

import

"fmt"

func

main()

package main

import

"fmt"

func

main()

s2 :=

make([

]int,3

,20)var n int

n =copy

(s2, s1)

fmt.

println

(n, s2,

len(s2)

,cap

(s2)

)s3 := s1[4:

6]fmt.

println

(n, s3,

len(s3)

,cap

(s3)

)n =

copy

(s3, s1[1:

5])fmt.

println

(n, s3,

len(s3)

,cap

(s3)

)}

48. go 請求處理頻率控制
package main

import

"time"

import

"fmt"

func

main()

close

(requests)

// 這個limiter的ticker每隔200毫秒結束通道阻塞

// 這個limiter就是我們頻率控制處理器

limiter := time.

tick

(time.millisecond *

200)

// 通過阻塞從limiter通道接受資料,我們將請求處理控制在每隔200毫秒

// 處理乙個請求,注意`<-limiter`的阻塞作用。

for req :=

range requests

// 我們可以保持正常的請求頻率限制,但也允許請求短時間內爆發

// 我們可以通過通道快取來實現,比如下面的這個burstylimiter

// 就允許同時處理3個事件。

burstylimiter :=

make

(chan time.time,3)

// 填充burstylimiter,先傳送3個資料

for i :=

0; i <

3; i++

// 然後每隔200毫秒再向burstylimiter傳送乙個資料,這裡是不斷地

// 每隔200毫秒向burstylimiter傳送資料

gofunc()

}()// 這裡模擬5個請求,burstyrequests的前面3個請求會連續被處理,

// 因為burstylimiter被先連續傳送3個資料的的緣故,而後面兩個

// 則每隔200毫秒處理一次

burstyrequests :=

make

(chan

int,5)

for i :=

1; i <=

5; i++

close

(burstyrequests)

for req :=

range burstyrequests

}

49. go 時間
package main

import

"fmt"

import

"time"

func

main()

50. go 時間戳
package main

import

"fmt"

import

"time"

func

main()

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內部培訓 節點解析21 30

21.go 並行通道channelpackage main import fmt func main 使用 channel 語法來從channel讀取資料 這裡我們從main函式所在的協程來讀取剛剛寫入 messages通道的資料 msg messages fmt.println msg 22.go...

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...