后端与go|青训营笔记

42 阅读3分钟

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

前言

本节课程主要分为四个方面:

  1. 并发编程
  2. 依赖管理
  3. 单元测试 Mock测试 基准测试
  4. 项目实战 - 组件及技术点

1. 并发编程

1.1通过通信共享内存而不是通过共享内存而实现通信

1.2开启了 3 个 go 协程,用于打印输出数字123

package attention

import (
	"time"
)

func closure() {
	for i := 0; i < 3; i++ {
		go func() {
			println(i)
		}()
	}
	time.Sleep(3 * time.Second)
}

func closure1() {
	for i := 0; i < 3; i++ {
		go func(j int) {
			println(j)
		}(i)
	}
	time.Sleep(3 * time.Second)
}

1.3 channel

make(chan int) 无缓冲通道

make(chan int,2)有缓冲通道

A 子协程发送 0-9

B 子协程计算输入数字的平方

主协程输出最后平方数

package main
func CalSquare() {
    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)
    }
}
func main(){
	CalSquare()
}


1.4并发安全 Lock,原子操作,进入临界区加锁退出解锁

var(
	x int64
	lock sync.Mutex
)

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

1.5WaitGroup

计数器 开启+1,执行 -1

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

func ManyGo() {
	var wg sync.WaitGroup
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(j int) {
			defer wg.Done()
			hello(j)
		}(i)
	}
	wg.Wait()
}

2.依赖管理

2.1演进

1.GPATH

一个环境

src bin pkg

项目依赖src

2.GOVender

每个项目都有自己的vendor目录,存放第三方库
GOVENDOR有大量第三方依赖管理工具:glide,dep,go dep

3.Go Mudule

通过 go.mod文件管理依赖包 go mod由go命令统一的管理,用户不必关心目录结构

依赖管理三要素

1.配置文件 go.mod

2.中心仓库管理依赖库 Proxy

3.本地工具 go get/mod

依赖配置

依赖图

依赖分发-回源

3. 单元测试

3.1什么是单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。 3.2怎么进行单元测试

  1. 要开始一个单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾。
  2. 单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀
  3. func TestXXX( t *testing.T )
  4. 测试用例文件不会参与正常源码编译,不会被包含到可执行文件中。
  5. 测试用例文件使用 go test 指令来执行,不需要 main() 作为函数入口。
  6. 测试用例可以不传入 *testing.T 参数
  7. 新建的测试文件一般和源文件 放同一目录

Mock测试 基准测试