进阶Go 语言,抓牢基础了解多线程以及版本管理 | 青训营笔记

85 阅读2分钟

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

前言

本文章记录了进阶Go语言部分内容,记录了今天所学的部分知识

1.并发和并行

并发是多线程在一个核的CPU上运行

并行是多线程程序在多个核CPU上运行

对于Go语言来说可以充分利用多核的优势,高效运行

1.1Goroutine

协成:属于用户态,轻量级线程,栈KB级别(在视频中写反了)

线程:内核态,线程跑多个协成,栈MB级别

1.1.1代码练习

通过线程随机打印数字

package main

import (
   "fmt"
   "time"
)

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

1.2CSP(communicating Sequential Processes)

1.2.1通过通信共享内存

Gorountine1->通道->Gorountine2&3

1.2.2通过共享内存实现通信

Gorountine1->临界区->Gorountine2&3

对于GO语言提倡通过通信共享实现通信

1.3Channel

make(chan int)  //无缓存通道
make(chan int,2) //有缓存通道

1.3.1Channel代码练习

package main

import (
   "fmt"
)

func main() {
   CalSquare()
}
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 {
      fmt.Println(i)
   }
}

2.依赖管理 2.1背景

项目工程不可能基于标准库0-1编码搭建 管理好依赖库可以提升项目构建的效率

2.2Go依赖管理演进

Go的依赖管理演进为这三种

GOPATH->GO Vendor->Go Module

  • 在不同环境下依赖的版本不同
  • 控制依赖库的版本

2.2.1GOPATH

  • 需要在环境变量配置
  • 项目代码直接依赖SRC下的代码
  • go get下载最新的版本的包到SRC目录下

弊端: 场景:A和B依赖某一package的不同版本 问题:无法实现package的多版本控制

2.2.2Go Vendor

  • 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/bendor
  • 依赖寻址方式:vendor => GOPATH 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题

弊端:

  • 无法控制依赖的版本
  • 更新项目又可能出现依赖冲突,导致编译出错

2.2.3Go Module 通过go.mod文件管理依赖包版本 通过go get/go mod 指令工具管理依赖包 最终目的:定义版本规则和管理项目的依赖关系

引用参考

参考的部分内容来源于以下课程或网页:

  • 字节内部课:Go 语言进阶 - 工程进阶
  • Go语言教程|菜鸟教程