【后端开发】字节跳动青训营之Go语言进阶与依赖管理

Go语言进阶与依赖管理

  • 一、Go语言进阶
    • [1.1 并发与并行](#1.1 并发与并行)
    • [1.2 协程与线程](#1.2 协程与线程)
    • [1.3 通道](#1.3 通道)
      • [1.3.1 生产消费模型](#1.3.1 生产消费模型)
    • [1.4 并发安全](#1.4 并发安全)
  • 二、依赖管理

一、Go语言进阶

Go语言一次可以创建上万个协程。

1.1 并发与并行

  1. 并发:多程序程序在单核CPU上运行。
  2. 并行:多程序程序在多核CPU上运行。

1.2 协程与线程

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

创建协程(实现快速加法):

go 复制代码
func main() {
    for i:=0; i<10; i++ {
        go Add(i, i)
    }
}

注:提倡通过通信共享内存,而不是通过共享内存而实现通信。

1.3 通道

使用make语言创建通道。

1.3.1 生产消费模型

go 复制代码
package main

import (
	"fmt"
	"time"
)

func producer(ch chan<- int) {
	for i := 1; i <= 10; i++ {
		ch <- i
		fmt.Println("生产者生产了", i)
		time.Sleep(time.Second)
	}
	close(ch)
}

func consumer(ch <-chan int) {
	for num := range ch {
		fmt.Println("消费者消费了", num)
		time.Sleep(2 * time.Second)
	}
}

func main() {
	// 创建一个无缓冲的通道
	ch := make(chan int)
	
	// 启动生产者和消费者
	go producer(ch)
	go consumer(ch)
	
	// 等待程序执行完毕
	time.Sleep(30 * time.Second)
}

1.4 并发安全

当多个协程同时对一个变量进行操作的时候,可能会出现并发安全Lock问题,就是可能变量最后的值并不一定是希望的值。

go 复制代码
package main

import (
	"fmt"
	"time"
)

func producer(ch chan<- int) {
	for i := 1; i <= 10; i++ {
		ch <- i
		fmt.Println("生产者生产了", i)
		time.Sleep(time.Second)
	}
	close(ch)
}

func consumer(ch <-chan int) {
	for num := range ch {
		fmt.Println("消费者消费了", num)
		time.Sleep(2 * time.Second)
	}
}

func main() {
	// 创建一个无缓冲的通道
	ch := make(chan int)
	
	// 启动生产者和消费者
	go producer(ch)
	go consumer(ch)
	
	// 等待程序执行完毕
	time.Sleep(30 * time.Second)
}

在协程对变量进行操作之前应该首先获得锁。
注!在现实开发中应该尽量避免对共享内存的并发操作。

二、依赖管理

在开发大型Go项目的时候,应该将精力放在逻辑上,而不是代码的重复开发,因此就出现了各种各样的包用来实现项目的快速搭建。

  • bin:项目编译的二进制文件
  • pkg:项目编译的中间产物,用于加速编译
  • src:项目源码

注!通过go get/go mod命令可以获取最先的项目源码。

Go在依赖配置的时候会选择一个最低兼容版本。

相关推荐
Mandy的名字被占用了6 小时前
晨风AI+知识付费系统|学练考全闭环,重构教育变现新模式
人工智能·后端
人间凡尔赛6 小时前
Next.js 16 生产级实战:Cache Components + View Transitions 完整指南
开发语言·javascript·ecmascript
why技术7 小时前
分享一套我一直在使用的 AICoding 组合拳,小而美的典范。
前端·后端·ai编程
GetcharZp8 小时前
SRS实战:一个开源流媒体服务,支持6大协议,80ms低延迟,轻松搭建自己的直播平台
后端
Csvn8 小时前
📊 SQL 入门 Day 7:子查询 — 查询中的查询
后端·sql
稚南城才子,乌衣巷风流10 小时前
函数:编程中的核心概念
开发语言·前端·javascript
阿米亚波10 小时前
【C++】流式数据输入处理(不完全整理)
开发语言·c++·笔记
大模型码小白11 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
IT_陈寒11 小时前
为什么我的JavaScript异步代码总是不按顺序执行?
前端·人工智能·后端
星栈11 小时前
Node 框架怎么选?Express、Koa、Egg、NestJS 场景化选型指南
后端·node.js