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 依赖管理演进
控制依赖库的版本
- GOPATH
- Go Vender
- 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 依赖管理三要素
- 配置文件,描述依赖:go.mod
- 中心仓库管理依赖库:proxy
- 本地工具: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梦…
相关文章:
241117学习日志——[CSDIY] [ByteDance] 后端训练营 [05]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...
Oracle 19C 安装RAC磁盘投票失败
ORACLE 19C 安装RAC第二个节点报错,没有找到足够的 voting 文件(投票磁盘) 1、磁盘投票失败分析 1.1、02节点报错日志 CRS-4123: Starting Oracle High Availability Services-managed resources CRS-2672: Attempting to start ora.mdnsd…...
vulfocus在线靶场:骑士cms_cve_2020_35339:latest 速通手册
目录 一、启动环境,访问页面,ip:端口号/index.php?madmin,进入后台管理页面,账号密码都是adminadmin 二、进入之后,根据图片所示,地址后追加一下代码,保存修改 三、新开标签页访问:①ip:端…...
【Linux内核深度解析】TCP协议栈之tcp_recvmsg
tcp_recvmsg 是 Linux 内核中用于处理 TCP 套接字接收数据的核心函数。它的主要任务是从接收队列中读取数据并将其复制到用户空间。 函数原型 int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int flags, int *addr_le…...
android-studio-4.2下载 、启动
下载 分享一个国内的android studio网站,可以下载SDK和一些Android studio开发工具 https://www.androiddevtools.cn/ 启动 JAVA_HOME/app/zulu17.48.15-ca-jdk17.0.10-linux_x64/ /app5/android-studio-home/android-studio-ide-201.6568795-linux-4.2C1/bin/s…...
Excel——宏教程(2)
Excel——宏教程(2) 一)、处理单元格 1、直接赋值与引用 将变量、常量值直接赋给单元格、或将单元格的值直接赋给变量、常量,这是在excel中最简单的单元格赋值及引用方法。 如下例将工作表"Sheet1"A1单元格的值赋给Integer变量I,并将I1的值…...
React Native 全栈开发实战班 - 性能与调试之打包与发布
在完成 React Native 应用的开发与性能优化后,下一步就是将应用打包并发布到各大应用市场,如 Apple App Store 和 Google Play Store。本章节将详细介绍 React Native 应用的打包与发布流程,包括 Android 和 iOS 平台的打包步骤、签名配置、发…...
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
最近在做一个与激光器用串口进行通讯的程序文档中要求将频率参数以3个字节的方式进行发送。这里记录一下过程。以便以后再有类似问题时可以快速解决。 /// <summary>/// 设置频率/// </summary>/// <param name"sender"></param>/// <par…...
Win11下载和配置VSCode(详细讲解)
配置VSCode需要的工具: 一、MinGW-w64 二、Visual Studio Code 一、MinGW-w64下载 1、下载 MinGW官网地址: Downloads - MinGW-w64 直链下载: 下载 mingw-w64-install.exe (MinGW-w64 - 适用于 32 位和 64 位 Windows&#…...
基于Multisim的多路智力竞赛抢答器设计与仿真
(1)设计一个8路智力竞赛抢答器,主持人可控制系统的清零和抢答的开始,控制电路可实现最快抢答选手按键抢答的判别和锁定功能,并禁止后续其他选手抢答。 (2)抢答选手确定后给出一声音响的提示和选手编号的显示,抢答选手的编号显示保持到系统被清零为止。 …...
Three.js 闪电效果
闪电shader const shader new THREE.ShaderMaterial({uniforms: {iTime: this.iTime,color: { value: new THREE.Color("#D2F8FE") },},vertexShader: /* glsl */ varying vec2 vUv;varying float normalizeY;void main() {// vUv (uv * 2. - 2.) * vec2(0.3,2.);…...
高效序列化工具(1)-----Protobuf
目录 1.Protobuf Protobuf 的特点 工作原理 Protobuf 与 JSON、XML 的对比 2.protobuf语法 1.数据类型 2.消息 3.枚举 4.嵌套消息 5.重复字段 6.默认值 7.其他类型 1.oneof类型 2.any类型 8.文件组织 3.protobuf命令 1.常见命令 选项: 1. --proto_…...
湛江市社保卡申领指南:手机获取电子照片回执单号
在湛江市,社保卡的申领流程已经实现了数字化,为市民带来了极大的便利。特别是通过手机获取数码照片回执单号,这一环节更是简化了申领过程。今天,我们将详细介绍如何不去照相馆,利用手机来获取数码照片回执单号…...
HTML5实现剪刀石头布小游戏(附源码)
文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…...
TypeScript之常见类型
常见类型(Everyday Types) 本章我们会讲解 JavaScript 中最常见的一些类型,以及对应的描述方式。注意本章内容并不详尽,后续的章节会讲解更多命名和使用类型的方式。 类型可以出现在很多地方,不仅仅是在类型注解 (type annotations)中。我们不仅要学习类型本身,也要学习…...
MacOS java多版本安装与管理-sdkman
安装sdkman curl -s "https://get.sdkman.io" | bashsource "$HOME/.sdkman/bin/sdkman-init.sh"sdk version正常出现sdkman版本号就安装成功了 # 安装java # 安装java8 sdk install java 8.0.412.fx-zulu建议和上述一样安装 fx-zulu 的jdk,…...
NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标
论文速读|MetaMetrics-MT: Tuning Meta-Metrics for Machine Translation via Human Preference Calibration 论文信息: 简介: 本文的背景是机器翻译(MT)任务的评估。在机器翻译领域,由于不同场景和语言对的需求差异&a…...
20241121 android中树结构列表(使用recyclerView实现)
1、adapter-item的布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wrap_content&…...
达索系统亮相第三十一届中国汽车工程学会年会暨展览会
伴随着改革开放以及中国入世WTO,三十多年来,中国汽车产销已经成为世界最大的单一市场而独占鳌头。近十年来,另辟蹊径的中国汽车产业人在新能源汽车赛道上引领了一波又一波令全球惊艳的创新成就,成为最为靓丽的新出口三大件的头牌。…...
Python网络爬虫实践案例:爬取猫眼电影Top100
以下是一个Python网络爬虫的实践案例,该案例将演示如何使用Python爬取猫眼电影Top100的电影名称、主演和上映时间等信息,并将这些信息保存到TXT文件中。此案例使用了requests库来发送HTTP请求,使用re库进行正则表达式匹配,并包含详…...
ROSSERIAL与Arduino IDE交叉开发(UBUNTU环境,包含ESP32、arduino nano)
ROSSERIAL与Arduino IDE交叉开发 一、简介二、安装1、Ubuntu下的Arduino IDE安装 **针对ESP32报错问题原因溯源和修改**三、运行结点 一、简介 这个教程展示在ubuntu环境下如何利用Arduino IDE配合rosserial开发机器人部件。通过Arduino IDErosserial实现arduino/esp32开发板通…...
爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具
第三节:使用Postman和浏览器开发者工具 在网络爬虫开发过程中,我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具(特别是Network面板和Console面板)是两种最常用的工具,能够帮助开发者有效地捕…...
ceph 18.2.4二次开发,docker镜像制作
编译环境要求 #需要ubuntu 22.04版本 参考https://docs.ceph.com/en/reef/start/os-recommendations/ #磁盘空间最好大于200GB #内存如果小于100GB 会有OOM的情况发生,需要重跑 目前遇到内存占用最高为92GB替换阿里云ubuntu 22.04源 将下面内容写入/etc/apt/sources.list 文件…...
游戏引擎学习第19天
介绍 这段内容描述了开发者在进行游戏开发时,对于音频同步和平台层的理解和调整的过程。以下是更详细的复述: 开发者表达了他希望今天继续进行的工作内容。他提到,昨天他讲解了一些关于音频的内容,今天他想稍微深入讲解一下他正…...
简单实现vue2响应式原理
vue2 在实现响应式时,是根据 object.defineProperty() 这个实现的,vue3 是通过 Proxy 对象实现,但是实现思路是差不多的,响应式其实就是让 函数和数据产生关联,在我们对数据进行修改的时候,可以执行相关的副…...
TypeScript 中扩展现有模块的用法
declare module 是 TypeScript 中用于扩展现有模块的特性。它允许开发者在已有模块的基础上,添加新的功能(比如扩展接口、添加类型声明等)。通过 declare module,可以将额外的声明合并到原模块中。以下是用法详解: 用…...