241117学习日志——[CSDIY] [ByteDance] 后端训练营 [05]

CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!!
第一弹:Cpp零基础学习【30 DAYS 从0到1】
第二弹:Cpp刷题文档【LeetCode】
第三弹:Go开发入门【字节后端青训营】
第四弹:Cpp简单项目开发【黑马Rookie】
第五弹:数据结构绪论【数据结构与算法】
第六弹:Go工程实践【字节后端青训营】

1. Go 语言进阶

并发 VS 并行

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

并行:多线程程序在多个核的CPU上运行(可以理解为实现并发的一个手段)

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

1.1 Goroutine

**协程:**用户态,轻量级线程 >栈、KB 级别

**线程:**内核态,线程跑多个协程 >栈、MB 级别

package concurrence
// 并发危险:乱序输出import ("fmt""sync"
)func hello(i int) {println("hello world : " + fmt.Sprint(i))
}func ManyGo() {var wg sync.WaitGroupfor i := 0; i < 5; i++ {wg.Add(1)go func(j int) {defer wg.Done()hello(j)}(i)}wg.Wait()
}

1.2 CSP(Communicating Sequential Processes)

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

1.3 Channel

make(chan 元素类型,[缓冲大小])

  • 无缓冲通道:make(chan int)

  • 有缓冲通道:make(chan int,2)

package concurrence
// 并发安全的例子,按序输出func CalSquare() {// 定义无缓冲src := make(chan int)// 定义缓冲dest := make(chan int, 3)go func() {// A协程的功能:发送0~9的数字defer close(src)for i := 0; i < 10; i++ {src <- i}}()go func() {// B协程的功能计算输入的数字的平方defer close(dest)for i := range src {dest <- i * i}}()for i := range dest {// 主协程输出最后的平方数println(i)}
}

1.4 并发安全 Lock

package mainimport ("sync""time"
)var (x    int64lock sync.Mutex
)func addWithLock() {for i := 0; i < 2000; i++ {// 通过锁机制保证并发安全// 获取临界区资源lock.Lock()x += 1// 释放临界区资源lock.Unlock()}
}func addWithoutLock() {for i := 0; i < 2000; i++ {x += 1}
}func main() {x = 0for i := 0; i < 5; i++ {go addWithoutLock()}time.Sleep(time.Second)// 有可能不会输出期望值println("Without Lock:", x)x = 0for i := 0; i < 5; i++ {go addWithLock()}time.Sleep(time.Second)// 输出期望值println("With Lock:", x)
}

实际开发中,避免对共享内存进行非并发安全的读写操作

1.5 WaitGroup

计数器

开启协程+1;执行结束-1;主协程阻塞直到计数器为0.

package mainimport ("sync"
)func main() {var wg sync.WaitGroup// 开辟五个协程wg.Add(5)for i := 0; i < 5; i++ {go func(j int) {// 通过 Done 方法进行计数器 -1defer wg.Done()println("goroutine", j, "start")}(i)}wg.Wait()
}

1.6 Go 并发编程小结

  • Goroutine
  • Channel
  • Sync:实现并发安全操作和协程间操作

2. Go 依赖管理

学会站在巨人的肩膀上

  • 工程项目不可能基于标准库 0~1 编码搭建(0基础开始到1)
  • 管理依赖库(框架、日志、driver等依赖,通过sdk方式引入)

2.1 Go 依赖管理演进

控制依赖库的版本

  1. GOPATH
  2. Go Vender
  3. Go Module

不同环境(项目)依赖的版本不同

2.1.1 GOPATH

是Go语言支持的一个环境变量

  • src:存放 Go 项目源码
  • pkg:存放编译的中间产物,加快编译速度
  • bin:存放 Go 项目编译生成的二进制产物

弊端

  • 如果项目A和项目B同时依赖某一package的不同版本
  • 那么GOPATH无法实现package的多版本控制
2.1.2 Go Vender
  • 项目目录下增加vender文件,所有依赖包副本形式放在vender
  • 依赖寻址方式:vender=>GOPATH

通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题

弊端

  • 如果项目A依赖pkg B和C,而B和C依赖了D的不同版本
  • 通过vender的管理模式不能很好控制对于D的依赖版本
  • 更新项目又可能出现依赖冲突,导致编译出错
2.1.3 Go Module
  • 通过 go.mod 文件管理依赖包版本
  • 通过 go get/go mod 指令工具管理依赖包

终极目标:定义版本规则和管理项目依赖关系

2.2 依赖管理三要素

  1. 配置文件,描述依赖:go.mod
  2. 中心仓库管理依赖库:proxy
  3. 本地工具:go get/mod

2.3

2.3.1 依赖管理 - go.mod
module example/project/app		// 依赖管理基本单元go 1.16							// 原生库require (example/lib1 v1.0.2			// 单元依赖	// 依赖标识:[Module Path][Version/Pseudo-version]
)
2.3.2 依赖配置 - version

两种版本规则:语义化版本、基于 commit 伪版本

语义化版本

v{MAJOR:不同模块}.{MINOR:新增函数功能}.{PATCH:修复bug}

v1.3.0

基于 commit 伪版本

vX.0.0{和语义化版本一样}-yyyymmddhhmmss{时间戳}-abcdefgh1234{校验码 哈希前缀}

2.3.3 依赖配置 - indirect

用来标识间接依赖

2.3.4 依赖配置 - incompatible

主版本在 2+ 的依赖,会 +incompatible

2.3.5 依赖分发 - 回源 - Proxy

代码托管系统:Github、SVN、…

  • 无法保证构建稳定性

  • 无法保证依赖可用性

  • 增加第三方压力

Proxy

直接从Proxy拉取依赖:稳定可靠。

2.3.6 依赖分发 - 变量 - GOPROXY
2.3.7 工具 - go get

go get example.org

2.3.8 工具 - go mod

go mod

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

3. Go 工程测试

测试就是保证质量

质量就是生命

  • 回归测试:回归用户体验

  • 集成测试:集成的接口测试

  • 单元测试:模块单元测试

从上到下,覆盖率逐层增大,测试成本逐层降低

3.1 单元测试

3.1.1 单元测试 - 规则
  • 所有测试文件以 _test.go 结尾(方便分清源代码和测试代码)
  • func TestXxx(*testing.T)
  • 初始化逻辑放到 TestMain中
3.1.3 单元测试 - 运行
3.1.5 单元测试 - 覆盖率

已测试代码量 / 总代码量

  • 一般覆盖率:50%~60%,较高覆盖率80%
  • 测试分支相互独立、全面覆盖
  • 测试单元粒度足够小,函数单一职责

3.2 单元测试 - 依赖

外部依赖 => 稳定&幂等

3.3 单元测试 - 文件处理

对文件:

  • 打开关闭操作
  • 文件内容替换操作

3.4 单元测试 - Mock

快速 Mock 函数

  • 为一个函数打桩
  • 为一个方法打桩

3.5 基准测试

3.5.1 基准测试 - 例子

随机选择执行服务器

3.5.2 基准测试 - 运行
3.5.3 基准测试 - 优化

4. Go 项目实践

4.1 需求描述

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

需求用例

  • 用户消费浏览:话题和回帖列表

4.3 ER 图 - Entity Relationship Diagram

  • 话题
  • 帖子

4.4 分层结构

  • Repository 数据层:数据 Module,外部数据的增删查改
  • Service 逻辑层:业务 Entity,处理核心业务逻辑输出
  • Controller 视图层:视图 view,处理和外部的交互逻辑

4.5 组件工具

  • Gin 高性能 go web 框架
  • Go Mod

4.6 Repository

4.7 Service

4.8 Controller

4.9 Router

4.10 运行

碎碎念:作业好多啊!!!屁事也好多,根本没有成片的时间来好好磨技术…真的老实了,再也不选那么多课了,课也不想好好听了…我指的是水课。搞得后面的项目都想摆烂了…这样应付大学老师的日子什么时候是个头啊!感觉时间都不是自己的…但还是要坚持啊…为了我的BAT梦…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改gitee提交时用户名密码输错导致提交失败的解决方法

1、打开控制面板&#xff0c;点击用户账户 点击管理Windows凭据 点击Windows凭据&#xff0c;找到gitee,删除后重新git push 重新输入密码即可

Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 优化场景定义

Pytest-Bdd-Playwright 系列教程&#xff08;10&#xff09;&#xff1a;配置功能文件路径 & 优化场景定义 前言一、功能文件路径的配置1.1 全局设置功能文件路径1.2. 在场景中覆盖路径 二、避免重复输入功能文件名2.1 使用方法2.2 functools.partial 的背景 三、应用场景总…

安装gentoo之第二步:安装gentoo基本系统

目标 &#xff1a;将gentoo配置为服务器&#xff0c; 一、下载并解压stage文件 1.官网下载stage文件 网址&#xff1a;https://www.gentoo.org/downloads/ 将gentoo配置为服务器&#xff0c;所以只下载了stage3-amd64-systemd-20241117T163407Z.tar.xz这个最小的stage文件. 基…

Methode Electronics EDI 需求分析

Methode Electronics 是一家总部位于美国的全球性技术公司&#xff0c;专注于设计和制造用于多个行业的电子和电气组件&#xff0c;产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域&#xff0c;提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…

Java基础知识(六)

文章目录 StringString、StringBuffer、StringBuilder 的区别&#xff1f;String 为什么是不可变的?字符串拼接用“” 还是 StringBuilder?String#equals() 和 Object#equals() 有何区别&#xff1f;字符串常量池的作用了解吗&#xff1f;String s1 new String("abc&qu…

p2p网络介绍

P2P&#xff08;Peer-to-Peer&#xff09;网络 是一种去中心化的通信模型&#xff0c;其中每个参与者&#xff08;节点&#xff09;既是客户端&#xff0c;又是服务器。与传统的客户端-服务器&#xff08;C/S&#xff09;架构不同&#xff0c;在 P2P 网络中&#xff0c;所有节点…

C++ STL(7)set

文章目录 一、set1、简介2、迭代器3、常用操作4、应用示例 前言&#xff1a; std::set是C标准模板库&#xff08;STL&#xff09;中的一个关联容器&#xff0c;它存储唯一元素&#xff0c;并自动按升序排列。std::set通常用于需要快速查找、插入和删除元素的场景&#xff0c;同…

ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29‘ not found

3.一、编译安装make 以make4.2 2.2.1为例 1.下载make wget https://ftp.gnu.org/gnu/make/make-4.2.tar.gz 2.解压make4.2安装包 tar -zxvf make-4.2.tar.gz && cd make-4.2 3.编译安装make-4.2 ./configure --prefix/usr/local/make4.2 make && make …

一文解决Latex中的eps报错eps-converted-to.pdf not found: using draft setting.

在使用Vscode配的PDFLatex编译IEEE TII的Latex模板时&#xff0c;出现eps文件不能转换为pdf错误&#xff0c;看了几十篇方法都没用&#xff0c;自己研究了半天终于可以正常运行了。主要原因还是Settings.JSON中的PDFLatex模块缺少&#xff1a;"--shell-escape", 命令…

深度学习神经网络中的优化器的使用

深度学习:神经网络中的优化器的使用 在深度学习中&#xff0c;优化器是用于更新和调整模型参数&#xff08;例如权重和偏置&#xff09;的算法&#xff0c;目的是减小模型在训练数据上的损失函数值。优化器的核心目标是通过适当的算法快速有效地找到损失函数的最小值或近似最小…

Redis基本的全局命令

在学习redis基本的全局命令之前呢&#xff0c;我们必须先进入redis-cli客户端才行。 如图&#xff1a; get和set get和set是redis两个最核心的命令。 get&#xff1a;根据key来获取value。 set&#xff1a;把key和value存储进去。 如set命令如图&#xff1a; 对于上述图中&…

嵌入式开发人员如何选择合适的开源前端框架进行Web开发

在嵌入式系统的Web开发中&#xff0c;前端框架的选择对于项目的成败有着决定性的影响。一个合适的框架不仅能提高开发效率&#xff0c;还能保证系统的稳定性和可扩展性。本文将介绍几款适用于嵌入式Web开发的开源前端框架&#xff0c;并探讨它们的优缺点。 1. Element Plus V…

【数据结构OJ】【图论】图综合练习--拓扑排序

题目描述 已知有向图&#xff0c;顶点从0开始编号&#xff0c;求它的求拓扑有序序列。 拓扑排序算法&#xff1a;给出有向图邻接矩阵 1.逐列扫描矩阵&#xff0c;找出入度为0且编号最小的顶点v 2.输出v&#xff0c;并标识v已访问 3.把矩阵第v行全清0 重复上述步骤&#xff0…

XLNet——打破 BERT 局限的预训练语言模型

近年来&#xff0c;深度学习在自然语言处理&#xff08;NLP&#xff09;领域取得了革命性进展&#xff0c;其中 BERT 的出现标志着双向语言建模的强大能力。然而&#xff0c;BERT 也存在一些局限性&#xff0c;限制了其在生成任务中的表现。2019 年&#xff0c;由 Google 和 Ca…

力扣题目总结

1.游戏玩法分析IV AC: select IFNULL(round(count(distinct(Result.player_id)) / count(distinct(Activity.player_id)), 2), 0) as fraction from (select Activity.player_id as player_idfrom (select player_id, DATE_ADD(MIN(event_date), INTERVAL 1 DAY) as second_da…

量子计算来袭:如何保护未来的数字世界

目录 前言 一、量子计算安全的学习方向 1. 量子物理学基础 2. 量子计算原理与技术 3. 传统网络安全知识 4. 量子密码学 5. 量子计算安全政策与法规 二、量子计算的漏洞风险 1. 加密算法被破解风险 2. 区块链安全风险 3. 量子密钥分发风险 4. 量子计算系统自身风险 …

Elasticsearch面试内容整理-Elasticsearch 基础概念

Elasticsearch 是一个基于 Apache Lucene 的开源分布式搜索和分析引擎,提供强大的全文本搜索、实时数据分析、分布式存储等功能。以下是 Elasticsearch 的一些基础概念: 什么是 Elasticsearch? ● Elasticsearch 是一个用于全文搜索和实时分析的分布式搜索引擎。 ● 开源和可…

AJAX笔记 (速通精华版)

AJAX&#xff08;Asynchronous Javascript And Xml&#xff09; 此笔记来自于动力节点最美老杜 传统请求及缺点 传统的请求都有哪些&#xff1f; 直接在浏览器地址栏上输入URL。点击超链接提交 form 表单使用 JS 代码发送请求 window.open(url)document.location.href urlwi…

12、异常Exception:

12、异常Exception&#xff1a; 我们来看一段代码&#xff0c;了解下为什么需要异常处理&#xff1a; package com.jiangxian.Exception_;/*** author JiangXian~* version 1.0*/ public class Exception01 {public static void main(String[] args) {int num1 10;int num2 …

net某高校社交学习平台的设计与实现

摘 要 高校社交学习平台是一个融合了社交网络特性的在线学习交流系统&#xff0c;旨在促进高校学生之间的信息共享与学习互动。该平台通过提供学习资料、学习视频和学习交流等功能&#xff0c;支持发布学习动态、参与知识问答、并实时追踪学习进度。为学生提供一个全面且便捷的…