GoLang进阶 | 青训营笔记

64 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

一、本堂课重点内容:

  • Go语言进阶与依赖管理
  • Go语言工程实践之测试

二、详细知识点介绍:

  1. Go语言进阶与依赖管理
  • Goroutine 协程存在于用户态与线程相比,所占用的资源更少,更适合并发编程的场景。
package main

import (
   "fmt"
   "time"
)

func hello(i int) {
   println("hello goroutine : " + fmt.Sprint(i))
}

func main() {
   for i := 0; i < 5; i++ {
      // 开启协程
      go func(j int) {
         hello(j)
      }(i)
   }
   // 保证协程不退出
   time.Sleep(time.Second)
}
/** 
输出
hello goroutine : 0
hello goroutine : 3
hello goroutine : 1
hello goroutine : 4
hello goroutine : 2
*/
  • CSP Go通过通信共享内存,通过通道来进行相应的实现。
package main

import (
	"fmt"
)

func hello(i int) {
	println("hello goroutine : " + fmt.Sprint(i))
}

func main() {
	src := make(chan int)
	dest := make(chan int, 3)
	go func() {
		defer close(src)
		for i := 0; i < 10; i++ {
			src <- i
		}
	}()

	go func() {
		defer close(dest)
		for i := range src {
			dest <- i * i
		}
	}()

	for i := range dest {
		println(i)
	}
}    
  • 锁机制
package main

import (
	"sync"
	"time"
)

var (
	x    int64
	lock sync.Mutex
)

func addWithLock() {
	for i := 0; i < 2000; i++ {
		lock.Lock()
		x += 1
		lock.Unlock()
	}
}

func addWithoutLock() {
	for i := 0; i < 2000; i++ {
		x += 1
	}
}

func main() {
	x = 0
	for i := 0; i < 5; i++ {
		go addWithoutLock()
	}
	time.Sleep(time.Second)
	println("withoutLock:", x)
	x = 0
	for i := 0; i < 5; i++ {
		go addWithLock()
	}
	time.Sleep(time.Second)
	println("withLock:", x)
}
  • WaitGroup
package main

import (
	"fmt"
	"sync"
)

func hello(i int) {
	println("hello goroutine : " + fmt.Sprint(i))
}

func main() {
	var wg sync.WaitGroup
	wg.Add(5)
	for i := 0; i < 5; i++ {
		go func(j int) {
			defer wg.Done()
			hello(j)
		}(i)
	}
	wg.Wait()
}
  1. Go语言工程实践之测试

三、实践练习例子: