当前位置: 首页 > article >正文

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

Go语言进阶与依赖管理

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

一、Go语言进阶

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

1.1 并发与并行

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

1.2 协程与线程

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

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

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

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

1.3 通道

使用make语言创建通道。

1.3.1 生产消费模型

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问题,就是可能变量最后的值并不一定是希望的值。

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在依赖配置的时候会选择一个最低兼容版本。


http://www.kler.cn/a/516276.html

相关文章:

  • AI智慧社区--生成验证码
  • DRG/DIP 2.0时代下基于PostgreSQL的成本管理实践与探索(下)
  • Apache Hive3定位表并更改其位置
  • K8S中Service详解(三)
  • 26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置
  • 人工智能之深度学习_[4]-神经网络入门
  • Elementor Pro 3.27 汉化版 2100套模板 安装教程 wordpress主题中文编辑器插件免费下载
  • 缓存-Redis-数据结构-redis哪些数据结构是跳表实现的?
  • Node.js的解释
  • Charles 4.6.7 浏览器网络调试指南:基本界面与操作(二)
  • Vue 全局自适应大小:使用 postcss-pxtorem
  • [MySQL]数据类型以及表的属性与操作大全
  • linux虚拟机连接不上Xshell
  • NLP自然语言处理中Word2Vec和GloVe概述
  • 豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)
  • MongoDB 数据库备份和恢复全攻略
  • cesium相机
  • Flutter接django后台文件通道
  • Tensor 基本操作4 理解 indexing,加减乘除和 broadcasting 运算 | PyTorch 深度学习实战
  • 【人工智能】深度卷积神经网络学习
  • 【数据库】详解MySQL数据库中索引的本质与底层原理
  • 代码随想录day16
  • 一键视频转文字/音频转文字,浏览器右键提取B站视频文案,不限时长免费无限次可用
  • CRM项目的开发与调试整体策略
  • Flutter鸿蒙化中的Plugin
  • SpringCloud系列教程:微服务的未来(十五)实现登录校验、网关传递用户、OpenFeign传递用户