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

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梦…

相关文章:

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

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d&#xff1a;如果是两位数&#xff0c;将会在前面添上一位0 %.2f&#xff1a;会保留两位小数 如果是long&#xff0c;必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制&#xff1a; 十进制转任意进制时&#xff…...

k8s 学习笔记之 k8s 存储管理

文章目录 概述卷卷的常用类型emptyDir边车容器 HostPathnfsPV/PVC静态供给 PV 和 PVC创建静态 PV创建 pvc创建 pod 应用 pvc 动态供给 PV 和 PVC创建 StorageClass创建 pvc创建 pod 使用 pvc PV 的生命周期 内置存储对象ConfigMapSecret 配置文件自动重新加载方案**1. 应用内动…...

ios swift开发--ios远程推送通知配置

远程推送通知&#xff08;Push Notifications&#xff09;在 iOS 平台上是免费提供的&#xff0c;但需要一些准备工作。以下是开通和使用远程推送通知的基本步骤&#xff1a; 开通远程推送通知 注册 Apple Developer Program&#xff1a; 访问 Apple Developer 并注册一个开发…...

【JavaEE进阶】CSS

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

基于Java Springboot宠物领养救助平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

C/C++ 中有哪些类型转换方式? 分别有什么区别?

在C编写C/C代码的时候&#xff0c;我们经常会遇到发生类型转换的场景&#xff0c;比如 赋值运算符的两个操作数不同、实参和形参类型不同、函数返回值类型和接收返回值的类型不同&#xff0c;都会发生类型转换&#xff1b;所以&#xff0c;在C语言中提供了两种类型转换 —— 隐…...

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代&#xff0c;小程序租赁系统应运而生&#xff0c;成为企业管理租赁业务的一种新选择。随着移动互联网的普及&#xff0c;越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…...

Scala的Array

数组&#xff1a;物理空间上连续的&#xff08;一个挨一个&#xff09; 优势&#xff1a;根据下标&#xff0c;能快速找到元素 列表&#xff1a;物理空间上不连续&#xff08;不是一个元素挨着一个元素&#xff09; 优势&#xff1a;插入元素&#xff0c;删除比较快 object…...

等保测评怎么做?具体流程是什么?

等保测评是对信息系统进行等保&#xff08;等级保护&#xff09;安全评测的过程。等保是指对信息系统进行等级化保护管理&#xff0c;目的是提高信息系统的安全性&#xff0c;防止信息泄露、篡改、破坏等安全问题。哈尔滨等保测评按照《中华人民共和国网络安全法》及《信息安全…...

基于YOLOv8深度学习的汽车车身车损检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOV8深度学习模型的汽车车身车损检测系统&#xff0c;旨在解决传统车损检测中效率低、精度不高的问题。该系统利用YOLOV8的目标检测能力&#xff0c;在单张图像上实现了车身损坏区域的精确识别和分类&#xff0c;尤其是在车身凹痕、车身裂纹和车身划…...

力扣 LeetCode 144. 二叉树的前序遍历(Day6:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归&#xff08;中左右&#xff09; 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)修图软件入门操作参考,收集查过的各个细节用法

到现在&#xff0c;对于Ai的使用也是一半一半&#xff0c;基本上都是用到啥就查啥。因为用得也不是很频繁&#xff0c;脑子也记不住很多操作&#xff0c;所以有时候靠肌肉记忆&#xff0c;很多时候&#xff0c;得再百度一遍…… 所以 我在这再备份一下&#xff0c;做个搬运工 …...

Apache Paimon、Apache Hudi、Apache Iceberg对比分析

Apache Paimon、Apache Hudi、Apache Iceberg 都是面向大数据湖的表格式存储管理框架。它们各自的架构、数据管理方式以及适用场景有所不同。下面是对三者的详细对比分析: 1. 基本简介 Apache Paimon: Paimon 是一个新兴的数据湖存储引擎,旨在支持流批一体的数据处理和管理…...

[ 网络安全介绍 5 ] 为什么要学习网络安全?

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

生产环境centos8 Red Hat8部署ansible and 一键部署mysql两主两从ansible脚本预告

一、各节点服务器创建lvm逻辑卷组 1.初始化磁盘为物理卷&#xff08;PV&#xff09; 命令&#xff1a;sudo pvcreate /dev/vdb 2.创建卷组&#xff08;VG&#xff09; 命令&#xff1a;sudo vgcreate db_vg /dev/vdb 3.创建逻辑卷&#xff08;LV&#xff09; 命令&#xff1a;s…...

华为云stack网络服务流量走向

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

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

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

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP&#xff1f;HTTP和HTTPS有什么区别&#xff1f;分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别&#xff1f;HTTP请求方式有哪些&#xff1f;请解释GET和POST的区别&#xff1f;HT…...

JAVA中对象实体与对象引用有何不同?举例说明

在 Java 中&#xff0c;对象实体&#xff08;Object instance&#xff09;和对象引用&#xff08;Object reference&#xff09;是两个不同的概念&#xff0c;虽然它们通常被一起讨论&#xff0c;但它们的作用和表现方式是不同的。下面我们来详细说明这两者的区别。 1. 对象实体…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

「Java基本语法」变量的使用

变量定义 变量是程序中存储数据的容器&#xff0c;用于保存可变的数据值。在Java中&#xff0c;变量必须先声明后使用&#xff0c;声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例&#xff1a;声明与初始化 public class VariableDemo {publi…...