go语言进阶及框架初探 | 青训营笔记

80 阅读3分钟

go语言进阶

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

  • go语言可以高效利用多核CPU

  • 可以使用chan关键词创建通道,存在无缓冲通道和缓冲通道

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)
    }
}
  • 和java的lock一样,也存在并发安全的问题

  • waitgroup相关

    • WaitGroup 是 Go 内置的 sync 包解决任务编排的并发原语。WaitGroup 直译是“等待组”,翻译成大白话就是等待一组协程完成任务。如果没有完成,就阻塞
    • 举个例子,我们要计算100万个数的和,并对这个和求根号。常规的思路肯定是先一个 for 循环计算总和,再开根号,但是这样效率很低。我们可以起1000个协程,每个协程计算1000个数的和,然后再对这些和求和,最后再开个根号。
    • 这里有一个问题,计算根号的时候,需要等所有并发的协程都计算完才行,WaitGroup 就是解决等所有并发协程完成计算的问题的
  • WaitGroup 的用法很简单。标准库中的 WaitGroup 只有三个方法,分别是

    • Add:用来设置 WaitGroup 的计数值,delta 可正可负
    • Done:用来将 WaitGroup 的计数值减一,其实就是调用了 Add(-1)。
    • Wait:阻塞等待,直到 WaitGroup 的计数值变成0,进入下一步。
func (wg *WaitGroup) Add(delta int)
func (wg *WaitGroup) Done()
func (wg *WaitGroup) Wait()
  • 依赖库相关

    • GOPATH方式

      • bin:项目编译的二进制文件
      • pkg:项目编译的中间产物,用于加速编译
      • src:项目源代码
      • 项目代码直接依赖src下的代码
      • go get下载最新的包到src目录
      • 弊端:同一项目无法使用同一包的不同版本
    • GO Vendor

    image-20230116103635785

    image-20230116103755790

    • GO Module

      • 通过go.mod文件管理依赖包版本
      • 通过go get/go mod指令工具管理依赖包
      • 目的在于定义版本规则和管理项目依赖关系

      image-20230116104027363

  • 使用github作为代码源地址的坏处

    • 无法保证代码的稳定性(易被删除等)
    • 无法保证代码的依赖可用性
    • 增加第三方代码平台的压力
  • 引入go proxy,代理从github上缓存代码

  • go mod常用工具

    • init:初始化,创建go.mod文件
    • download:下载模块到本地缓存
    • tidy:增加需要的依赖删除不需要的依赖

go语言测试

  • 测试种类

    • 单元测试:对函数进行测试
    • mock测试:设置桩函数进行测试
    • 基准测试:对函数性能进行测试
  • 注意fastrand高并发场景下效率更高

gin框架和gorm框架初探

  • 类似java,编写对应的url映射获取相应结果