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

相关文章
相关标签/搜索