Go语言入门 — 工程实践 | 青训营笔记

65 阅读2分钟

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

此笔记的主要内容如下

  • 语言进阶:从并发编程的视角了解Go高性能的本质
  • 依赖管理:了解Go语言依赖管理的演进路线
  • 测试:从单元测试实践出发提升大家的质量意识
  • 项目实战:通过项目需求、需求拆解、逻辑设计、代码实现感受真实的项目开发

并发 vs 并行

多线程程序在一个核的cpu上运行,这种同时运行状态的实现主要是通过时间片切换来达到的;并行是直接利用多核实现多线程的同时运行。

在实际应用场景中,并行是实现并发的一种手段

Go可以充分发挥多核优势,高效运行

Goroutine

协程:用户态,轻量级线程,栈MB级别 线程:内核态,线程跑多个协程,栈KB级别

例.快速打印hello (快速,所以需要多个协程)

func hello(i int) {
    println("hello: " + fmt.Sprint(i))
}
func main() {
    for i := 0; i < 5; i++ {
        go func(j int) {
            hello(j)
        }(i)
    }
    time.Sleep(time.Second)
}

Communicating Sequential Processes

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

Channel

例.A子协程发送0-9数字,B子协程计算输入数字的平方,朱携程输出最后的平方数

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)
    }
}

并发安全Lock

var (
    x int64
    lock sync.Mutex
)
func addWithLock() {
    for i:=0; i < 2000; i++ {
        lock.Lock()
        x+=1
        lock.Unlock()
    }
}
func Add() {
    x = 0;
    for i:=0; i < 5; i++ {
        go addWithLock()
    }
    time.Sleep(time.Second)
}

项目实战

社区话题页面

  • 展示话题(标题,文字描述)和回帖列表
  • 暂不考虑前端页面实现,仅仅实现一个本地web服务
  • 话题和回帖数据用文件存储

分层结构

image.png

  • 数据层:数据Model,外部数据的增删改查
  • 逻辑层:业务Entity,出力核心业务逻辑输出
  • 视图层:视图View,处理和外部的交互逻辑