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的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...

蓝桥杯备赛(持续更新)
16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d:如果是两位数,将会在前面添上一位0 %.2f:会保留两位小数 如果是long,必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制: 十进制转任意进制时ÿ…...
k8s 学习笔记之 k8s 存储管理
文章目录 概述卷卷的常用类型emptyDir边车容器 HostPathnfsPV/PVC静态供给 PV 和 PVC创建静态 PV创建 pvc创建 pod 应用 pvc 动态供给 PV 和 PVC创建 StorageClass创建 pvc创建 pod 使用 pvc PV 的生命周期 内置存储对象ConfigMapSecret 配置文件自动重新加载方案**1. 应用内动…...
ios swift开发--ios远程推送通知配置
远程推送通知(Push Notifications)在 iOS 平台上是免费提供的,但需要一些准备工作。以下是开通和使用远程推送通知的基本步骤: 开通远程推送通知 注册 Apple Developer Program: 访问 Apple Developer 并注册一个开发…...

【JavaEE进阶】CSS
本节⽬标 掌握 CSS 基本语法规范和CSS选择器的各种⽤法, 熟练使⽤CSS的常⽤属性. 一.CSS介绍 1.什么是CSS? CSS(Cascading Style Sheet),层叠样式表, ⽤于控制⻚⾯的样式. CSS 能够对⽹⻚中元素位置的排版进⾏像素级精确控制, 实现美化⻚⾯的效果. 能够做到⻚⾯…...

基于Java Springboot宠物领养救助平台
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
C/C++ 中有哪些类型转换方式? 分别有什么区别?
在C编写C/C代码的时候,我们经常会遇到发生类型转换的场景,比如 赋值运算符的两个操作数不同、实参和形参类型不同、函数返回值类型和接收返回值的类型不同,都会发生类型转换;所以,在C语言中提供了两种类型转换 —— 隐…...

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案
内容概要 在这个数字化飞速发展的时代,小程序租赁系统应运而生,成为企业管理租赁业务的一种新选择。随着移动互联网的普及,越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…...
Scala的Array
数组:物理空间上连续的(一个挨一个) 优势:根据下标,能快速找到元素 列表:物理空间上不连续(不是一个元素挨着一个元素) 优势:插入元素,删除比较快 object…...
等保测评怎么做?具体流程是什么?
等保测评是对信息系统进行等保(等级保护)安全评测的过程。等保是指对信息系统进行等级化保护管理,目的是提高信息系统的安全性,防止信息泄露、篡改、破坏等安全问题。哈尔滨等保测评按照《中华人民共和国网络安全法》及《信息安全…...

基于YOLOv8深度学习的汽车车身车损检测系统研究与实现(PyQt5界面+数据集+训练代码)
本文研究并实现了一种基于YOLOV8深度学习模型的汽车车身车损检测系统,旨在解决传统车损检测中效率低、精度不高的问题。该系统利用YOLOV8的目标检测能力,在单张图像上实现了车身损坏区域的精确识别和分类,尤其是在车身凹痕、车身裂纹和车身划…...

力扣 LeetCode 144. 二叉树的前序遍历(Day6:二叉树)
解题思路: 方法一:递归(中左右) class Solution {List<Integer> res new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {recur(root);return res;}public void recur(TreeNode roo…...
Adobe Illustrator(Ai)修图软件入门操作参考,收集查过的各个细节用法
到现在,对于Ai的使用也是一半一半,基本上都是用到啥就查啥。因为用得也不是很频繁,脑子也记不住很多操作,所以有时候靠肌肉记忆,很多时候,得再百度一遍…… 所以 我在这再备份一下,做个搬运工 …...
Apache Paimon、Apache Hudi、Apache Iceberg对比分析
Apache Paimon、Apache Hudi、Apache Iceberg 都是面向大数据湖的表格式存储管理框架。它们各自的架构、数据管理方式以及适用场景有所不同。下面是对三者的详细对比分析: 1. 基本简介 Apache Paimon: Paimon 是一个新兴的数据湖存储引擎,旨在支持流批一体的数据处理和管理…...

[ 网络安全介绍 5 ] 为什么要学习网络安全?
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...

生产环境centos8 Red Hat8部署ansible and 一键部署mysql两主两从ansible脚本预告
一、各节点服务器创建lvm逻辑卷组 1.初始化磁盘为物理卷(PV) 命令:sudo pvcreate /dev/vdb 2.创建卷组(VG) 命令:sudo vgcreate db_vg /dev/vdb 3.创建逻辑卷(LV) 命令:s…...

华为云stack网络服务流量走向
1.同VPC同子网同主机内ECS间互访流量走向 一句话通过主机内部br-int通信 2.同VPC同子网跨主机ECS间互访流量走向 3.同VPC不同子网同主机ECS间互访流量走向 查看ECS配置文件底层KVM技术 查看日志 查看ECS的ID号(管理员身份查询所有租户信息) 查看ECS的其…...

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)
引言:对于嵌入式硬件这个庞大的知识体系而言,太多离散的知识点很容易疏漏,因此对于这些容易忘记甚至不明白的知识点做成一个梳理,供大家参考以及学习,本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…...

计算机网络HTTP——针对实习面试
目录 计算机网络HTTP什么是HTTP?HTTP和HTTPS有什么区别?分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别?HTTP请求方式有哪些?请解释GET和POST的区别?HT…...
JAVA中对象实体与对象引用有何不同?举例说明
在 Java 中,对象实体(Object instance)和对象引用(Object reference)是两个不同的概念,虽然它们通常被一起讨论,但它们的作用和表现方式是不同的。下面我们来详细说明这两者的区别。 1. 对象实体…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...

门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
C#最佳实践:为何优先使用as或is而非强制转换
C#最佳实践:为何优先使用as或is而非强制转换 在 C# 的编程世界里,类型转换是我们经常会遇到的操作。就像在现实生活中,我们可能需要把不同形状的物品重新整理归类一样,在代码里,我们也常常需要将一个数据类型转换为另…...