Go語言實踐:初探

瞭解方向

  • 一些核心概念:併發或其餘(以及實現邏輯)
  • Go語言特性:
  • 打包/環境/開發依賴工具(獲取和構建代碼)
  • Go語言內置類型:數組/切片/映射
  • 內置類型系統:結構體類型,具名類型,接口,類型嵌套
  • 調度器/併發/通道如何工做
  • 經常使用的併發模式,goroutine池的實現,如何複用資源
  • 標準庫的使用:log,json,io
  • 測試/基準測試

細節特性

爲併發而生

  • 併發更好的使用多核心CPU
  • 併發基於GoRoutine,相似於線程,但並不是線程,能夠理解成一種虛擬線程
  • go運行時會調度gourouring,並將goroutine合理分配到每個CPU中,最大限度使用CPU
  • goroutine之間使用通道channel通訊
package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

const (
	numberGoroutines = 4 //要使用的goroutine數量
	taskLoad = 20 //要處理的工做數量
)

var wg sync.WaitGroup
//init 初始化包 在運行其餘代碼以前執行
func init(){
	rand.Seed(time.Now().Unix())
}

//入口函數
func main(){
	//建立一個有緩衝的通道來管理工做
	tasks :=make(chan string,taskLoad)

	//啓動GoRoutine來處理工做
	wg.Add(numberGoroutines)
	for gr :=1;gr<=numberGoroutines ;gr++  {
		go worker(tasks,gr)
	}

	//增長一組要完成的工做
	for post :=10; post<taskLoad;post++  {

		tasks <- fmt.Sprintf("Task: %d\n",post)
	}

	//完成以後關閉GoRoutine
	close(tasks)
	//等待全部工做完成
	wg.Wait()
}

//工做函數
func worker(tasks chan string,worker int){
	//通知函數已返回
	defer wg.Done()

	for{
		task,ok := <-tasks;
		if !ok {
			//表示通道已經空了,而且被關閉了
			fmt.Printf("Worker:%d: Shutting Down \n ",worker)

			return
		}

		fmt.Printf("Worker:%d: Started %s\n",worker,task)
		//隨機等待一段時間 再來工做
		sleep := rand.Int63n(100)
		time.Sleep(time.Duration(sleep)*time.Millisecond)

		fmt.Printf("Worker:%d:Completed %s\n",worker,task)
	}

}

複製代碼
  • 輸出
H-----E-----L-----L-----O-----
aaaa:0
aaaa:1
aaaa:2
aaaa:3
aaaa:4
aaaa:5
aaaa:6
aaaa:7
aaaa:8
aaaa:9賦值後:100 --- 200Multiply 2 * 5 * 6 = 60

Process finished with exit code 0
複製代碼

. . .json

相關文章
相關標籤/搜索