《使用Gin框架构建分布式应用》阅读笔记:p272-p306
《用Gin框架构建分布式应用》学习第15天,p272-p306总结,总35页。
一、技术总结
1.TDD(test-driven development)
虽然经常看到TDD这个属于,从本人的工作经历看,实际开发中用得相对较少。
2.unitest(单元测试)
go语言开发中,使用testify进行单元测试开发。
(1)创建测试文件
测试文件以xxx_test.go命名,与xxx.go在同一目录下。示例:main.go和mian_test.go在同一目录下。
(2)编写测试函数
测试函数必须Test作为前缀,后面跟被测试函数名,示例:被测试函数名称为IndexHandler,测试函数名称为TestIndexHandler。
main.go:
// main.go
package mainimport ("github.com/gin-gonic/gin""net/http"
)func IndexHandler(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "hello world"})
}func SetupServer() *gin.Engine {router := gin.Default()router.GET("/", IndexHandler)return router
}
func main() {err := SetupServer().Run()if err != nil {return}
}
main_test.go:
package mainimport ("github.com/stretchr/testify/assert""io""net/http""net/http/httptest""testing"
)func TestIndexHandler(t *testing.T) {// 不适用 testify// 注意,因为`{"message":"hello world"}`是字符串,所以冒号后面如果有空格,在判断相等的时候也会有影响// mockUserResp := `{"message":"hello world"}`//// ts := httptest.NewServer(SetupServer())// defer ts.Close()//// res, err := http.Get(ts.URL + "/")// if err != nil {// t.Fatalf("Expected no error: got %v", err)// }//// defer res.Body.Close()//// if res.StatusCode != http.StatusOK {// t.Fatalf("Expected status code 200: got %v", res.StatusCode)// }//// // ioutil.ReadAll 已不推荐使用// // responseData, err := ioutil.ReadAll(res.Body)// responseData, err := io.ReadAll(res.Body)// if string(responseData) != mockUserResp {// t.Fatalf("Expected hello world message: got %v", string(responseData))// }// 使用 testifymockUserResp := `{"message": "hello world"}`ts := httptest.NewServer(SetupServer())defer ts.Close()res, err := http.Get(ts.URL + "/")defer res.Body.Close()assert.Nil(t, err)assert.Equal(t, http.StatusOK, res.StatusCode)responseData, err := io.ReadAll(res.Body)assert.Equal(t, mockUserResp, string(responseData))
}
(3)执行测试
go test
3.coverage(测试覆盖率)
p282, Test coverage describes how much of a package’s code is exercised by running the package’s tests.
4.integration test(集成测试)
integration test就是多个功能一起测试。
5.security test(安全测试)
go语言开发中,使用gosec进行安全测试。
6.postman
书上介绍了postman的collection, environment, scripts的使用,基本属于工作中常用到的操作。当然,postman本身也不复杂。
go语言开发中,使用
7.吐槽系列
// chapter 01router := gin.Default()// chapter 07r := gin.Default()
作者在chapter 01用的名称是router, 那么在chapter 07也应该用这个,而不是r,保持字段名称的一致性!想起本人在实际工作中遇到的一个项目,其中表示“设备”的名称就用了三个:eqp, equip, equipment,但其实都是指同一个东西,这无形中会导致一些问题:(1)阅读代码的人会有疑问,这三个表示的是同一个东西吗?(2)写代码的时候得思考,用的是哪个名称。
二、英语总结
无。
三、其它
今天没有什么想说的。
四、参考资料
1. 编程
(1) Mohamed Labouardy,《Building Distributed Applications in Gin》:https://book.douban.com/subject/35610349
2. 英语
(1) Etymology Dictionary:https://www.etymonline.com
(2) Cambridge Dictionary:https://dictionary.cambridge.org

欢迎搜索及关注:编程人(a_codists)
相关文章:
《使用Gin框架构建分布式应用》阅读笔记:p272-p306
《用Gin框架构建分布式应用》学习第15天,p272-p306总结,总35页。 一、技术总结 1.TDD(test-driven development) 虽然经常看到TDD这个属于,从本人的工作经历看,实际开发中用得相对较少。 2.unitest(单元测试) go语言开发中&a…...
【搜索引擎】俄罗斯搜索引擎yandex
俄罗斯搜索引擎yandex 1997年,俄罗斯搜索引擎Yandex(俄语意为:语言目录)首次上线,已发展成为全球第四大搜索引擎和第二大非英语搜索引擎 https://yandex.com/...
加密源代码|html代码如何加密保护?3分钟学会4种源代码加密妙招,代码人必看
你是否曾担心过自己的源代码被轻易复制或篡改? 在这个开源和共享盛行的时代,如何加密源代码,成为了每个开发者不得不面对的问题。 古人云:“工欲善其事,必先利其器。”今天,我们就来探讨一下如何加密保护你…...
Jetson Orin NX平台自研载板 IMX477相机掉线问题调试记录
1. 前言 平台: NVIDIA Orin NX 硬件: 自研载板 相机: 3个IMX477树莓派HQ摄像头通过CSI接口连接 版本: L4T 35.4.1(我们也在35.5.0上测试了一些东西) 参数: 30fps,4032x3040 问题描述: 其中一个IMX477相机在录制过程中出现可变时间后退出 短则10秒,长则5小时,…...
spring-boot(整合mybatisplus、及常见注解)
介绍 在日常开发中单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是MybatisPlus. MyBatisPlus是针对于Mybatis框架的增强,即合…...
深度学习:yolov3的使用--建立模型
使用argparse模块来定义和解析命令行参数 创建一个ArgumentParser对象 parser argparse.ArgumentParser() 训练的轮数,每批图像的大小,更新模型参数之前累积梯度的次数,模型定义文件的路径。 parser.add_argument("--epochs", typeint, d…...
关于我、重生到500年前凭借C语言改变世界科技vlog.13——深入理解指针(3)
文章目录 1.字符指针变量2.数组指针变量3.函数指针变量4.函数指针数组5.二维数组传参本质6.拓展补充希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本章节接着学习常见的指针变量类型 1.字符指针变量 字符指针变量,顾名思义就是字…...
每日算法一练:剑指offer——数组篇(6)
1.点名 某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。 示例 1: 输入: records [0,1,2,3,5] 输出: 4示例 2: 输入: records [0, 1, 2, 3, 4, 5, 6, 8] 输出: 7提示: 1 < records.le…...
【环境搭建】Apache ZooKeeper 3.8.4 Stable
软件环境 Ubuntu 20.04 、OpenJDK 11 OpenJDK 11(如果已经安装,可以跳过这一步) 安装OpenJDK 11: $ sudo apt-get update$ sudo apt-get install -y openjdk-11-jdk 设置 JAVA_HOME 环境变量: $ sudo gedit ~/.bash…...
算法练习——双指针
前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 学前须知(对自己):这里的指针不一定指地址!也可能是数组下标。 1:移动零(双指针) 题目要求: 解题思路&#x…...
vue中el-table显示文本过长提示
1.el-table设置轻提示:show-overflow-tooltip“true“,改变轻提示宽度...
JS 字符串拼接并去重
1、includes 循环数组将某个字段拼接成新的字符串并去重(数组里面包含的一个对象,或者其他都OK) // 定义一个数组 let arr[.......] // 定义拼接的字符串 let a //循环数组将里面某个字段拼接在一起并去重 arr.forEach(item > {if(!a.in…...
opencv 图像预处理
图像预处理 在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作&…...
SAP B1 功能模块字段介绍 - 价格清单(下)
目录 背景 五、业务伙伴的特殊价格 1. 单据逻辑功能 2. 部分字段解释 3. 操作流程 3.1 时间相关 3.2 数量相关 4. 实例 六、复制特殊价格到选择标准 1. 单据逻辑功能 2. 部分字段解释 七、全局更新特殊价格 编辑 1. 单据逻辑功能 2. 部分字段解释 八、价格更…...
传智杯 第六届-复赛-D
题目描述: 小红定义两个字符串同构,当且仅当对于i∈[1,n],b[i]−a[i]i∈[1,n],b[i]-a[i]i∈[1,n],b[i]−a[i]是定值。例如,"bacd"和"edfg"是同构的。 现在小红拿到了一个长度为n的字符串a,她想知道&a…...
Java - 数组实现大顶堆
题目描述 实现思路 要实现一个堆,我们首先要了解堆的概念。 堆是一种完全二叉树,分为大顶堆和小顶堆。 大顶堆:每个节点的值都大于或等于其子节点的值。 小顶堆:每个节点的值都小于或等于其子节点的值。 完全二叉树ÿ…...
ifuse挂载后,在python代码中访问iOS沙盒目录获取app日志
上一次使用pymobiledevice3,在python代码中访问app的沙盒目录并分析业务日志,在使用过程中发现,在获取app日志的时候速度很慢,执行时间很长,需要30-61秒,所以这次尝试使用libimobiledevic和ifuse࿰…...
Windows WSL环境下安装 pytorch +ROCM 支持AMD显卡
官方文档:Install PyTorch for ROCm — Use ROCm on Radeon GPUs 一、操作系统及驱动 windows 下安装WSL 环境( windows subsystem for Linux), 安装ubuntu 22.04环境。 安装 rocm 软件包: sudo apt update wget https://repo.radeon.com/amdgpu-insta…...
uniapp中skymap.html(8100端口)提示未登录的排查与解决方法
问题: 目前账号已经登录,uniapp的其他端口均可以访问到数据,唯独skymap.html中的8100会提示未登录。(8100是后端网关gateway端口) 分析: 在 skymap.html 中遇到未登录提示的问题,通常是由于该…...
训练模型时梯度出现NAN或者INF(禁用amp的不同level)
判断参数梯度位nan或inf的代码: for name, param in model.named_parameters():if param.grad is not None:if torch.isnan(param.grad).any() or torch.isinf(param.grad).any():print(f"grad layer [{name}] is NaN or Inf") 首先来说可能得原因&…...
基于Sakura实验板的STM32流水灯项目实战:从GPIO控制到模式切换
1. 项目概述:从零到一,点亮你的第一串“流水”如果你刚拿到一块单片机开发板,面对一堆引脚和代码感到无从下手,那么“流水灯”几乎就是所有嵌入式开发者的“Hello World”。它简单、直观,却能让你快速理解GPIO…...
XUnity.AutoTranslator:打破游戏语言障碍的终极解决方案
XUnity.AutoTranslator:打破游戏语言障碍的终极解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏内容而苦恼吗?XUnity.AutoTranslator让语言障碍不再是问题&…...
告别FPN信息瓶颈:手把手图解Gold-YOLO的‘聚合-分发’机制(附代码逐行解读)
告别FPN信息瓶颈:手把手图解Gold-YOLO的‘聚合-分发’机制(附代码逐行解读) 在目标检测领域,YOLO系列模型凭借其出色的实时性能一直占据主导地位。然而,随着应用场景的复杂化,传统特征金字塔网络ÿ…...
深入解析Keil MDK FLM算法:SRAM运行原理与下载机制
1. 项目概述:FLM算法,Keil MDK下载的“灵魂引擎”如果你用Keil MDK给一块新的APM32或者STM32芯片下载程序,点下那个“Download”或“Load”按钮,几秒钟后“Programming Done”的提示框弹出,这个过程看似简单࿰…...
Perplexity文化新闻搜索响应延迟超2.3秒?工程师级诊断流程:从LLM推理缓存污染到文化实体消歧失败链路追踪
更多请点击: https://codechina.net 第一章:Perplexity文化新闻搜索响应延迟超2.3秒?工程师级诊断流程:从LLM推理缓存污染到文化实体消歧失败链路追踪 当Perplexity平台在处理“2024东京国际电影节获奖名单”或“巴西狂欢节历史溯…...
注册培训师、咨询师——杨刚老师简介
注册培训师、咨询师——杨刚老师简介注册培训师、咨询师 MTP认证讲师——日本产业训练协会认证 世界500强管理目视化解决方案 版权持有人 杨老师具备10年生产管理经验、15年培训及咨询辅导经验。曾任某日资企业制作课课长、某上市企业精益经理、某民营企业绩效经理、某咨…...
CANN ops-transformer 的 FlashAttention:把大模型的记忆从 32GB 压到 8GB,怎么做到的
刚接触昇腾CANN那会,我以为 ops-transformer 就是个普通的算子仓库,和 ops-math、ops-nn 没什么区别。后来跑一个 70B 模型的推理任务,显存直接爆了,才发现大模型的注意力计算才是真正的吞显存怪兽——而 ops-transformer 里那个 …...
科研学术篇---论文搜索方法
高效搜集和研读论文,是构建扎实知识体系的基石。要想做到“高效”与“高质”并重,需要把整个过程当作一个闭环系统来优化——从目标锁定、来源筛选、检索策略,到快速粗筛、深度内化、持续追踪,每一步都有对应的工具和心法。下面逐…...
小白程序员必看:四步轻松构建你的第一个AI编码Agent,收藏学习!
本文详细介绍了如何通过四个步骤构建一个基础的AI编码Agent,包括接入大型语言模型(LLM)、添加实用工具(如读取、写入和执行文件)、构建Agent循环以及实现对话循环。文章以Python语言为例,逐步引导读者完成整…...
探索罗技鼠标宏:掌握PUBG压枪技术的完整路径
探索罗技鼠标宏:掌握PUBG压枪技术的完整路径 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在《绝地求生》这款竞技性极强的射击游戏…...
