Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解

2023-11-17

Go 框架三件套

1. 概论

  • Gorm

    Gorm 是一个已经迭代了10年+的功能强大的 ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

  • Kitex

    Kitex 是字节内部 Golang 微服务 RPC 框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。

  • Hertz

    Hertz 是字节内部的 HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性特点

2. Gorm

官方文档

 //定义 gorm model 
type Product struct {
	Price uint Code string
}
为 model 定义表名
func (p Product) TableName() string { 
	return "product";
} 
func main(){
  db,err := gorm.0pen(
    连接数据库 
  mysgl.0pen(dsn:"user:passtcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local").&gorm.Config{})
  if err != nil {  
  	panic( v:"failed to connect database")
  }
  // Create 创建数据 
  db.Create(&Product{Code:"D42",Price: 100})
  // Read  查询数据 
	var product Product
  db.First(&product, 1) // 根据整形主键查找 
  db.First(&product,"code = ?", "D42")// 查找 code 字段值为 D42 的记录
  // Update - 将 product 的 price 更新为 200 更新数据 
  db.Model(&product).Update("Price"200)// Update - 更新多个字段
  db.Model(&product).Updates(Product{Price: 200,Code:"F42"})// 使用结构体 仅更新非零值字段
  db.Model(&product).Updates(map[stringlinterface{}{"Price": 200. "Code": "F42"})
  // Delete -删除 product 删除数据 
  db.Delete(&product, 1)
 } 

Notes

  • updates 传递结构体时 仅更新非零值字段,即显性初始化字段

  • GORM 目前支持的数据库MySQL, SQLServer, PostgreSQL, SQLite; GORM 通过驱动来连接数据库,如果需要连接其它类型数据库,可以复用或自行开发驱动

  • GORM 查询:

    First 的使用踩坑: 使用 First 时,需要注意查询不到数据会返回 ErrRecordNotFound。使用 Find 查询多条数据,查询不到数据不会返回错误。

    当使用结构作为条件查询时,GORM 只会查询非零值字段。这意味着如果您的字段值为 0、"、false 或其他 零值,该字段不会被用于构建查询条件,使用 Map 来构建查询条件。

  • 删除数据:

    软删除 会记录 Deleted gorm.DeletedAt 字段;

    拥有软删除能力的 Model 调用 Delete 时,记录不会被数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间,并且不能再通过正常查询的方法找到该记录。

    使用 Unscoped 可以查询到被软删除的数据。

  • 事务:

    一致性要求比较高的时候,使用事务; Gorm 提供了 Begin, Commit, Rollback 方法用于使用事务

    Transactions by manual

    //Transactions by manual
    // begin a transaction
    tx := db.Begin()
    
    // do some database operations in the transaction (use 'tx' from this point, not 'db')
    tx.Create(...)
    
    // ...
    
    // rollback the transaction in case of error
    tx.Rollback()
    
    // Or commit the transaction
    tx.Commit()
    

    Transaction

    db.Transaction(func(tx *gorm.DB) error {
      // do some database operations in the transaction (use 'tx' from this point, not 'db')
      if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
        // return any error will rollback
        return err
      }
    
      if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
        return err
      }
    
      // return nil will commit the whole transaction
      return nil
    })
    
  • Hook

    GORM 在 提供了 CURD 的 Hook 能力; Hook 是在创建、查询、更新、删除等操作之前、之后自动调用的函数。
    如果任何 Hook 返回错误,GORM 将停止后续的操作并回滚事务。
    Gorm 生态
    在这里插入图片描述

3. Kitex

官方教程

生态
在这里插入图片描述

4.Hertz

官方教程

生态
在这里插入图片描述

5. 应用实战项目

字节开源项目,整个项目应用了三件套作为开发框架,可供快速入门学习。
easynote

图片均来自字节青训营课程,博客作为自己学习记录,如有侵权,麻烦联系删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解 的相关文章

  • Golang 从管道读取读取大量数据

    我正在尝试读取一个正在被焦油化 流式传输到标准输入的存档 但我正在以某种方式读取far管道中的数据多于 tar 发送的数据 我像这样运行我的命令 tar cf somefolder my go binary 源代码是这样的 package
  • 防止使用 golang 服务器访问文件夹中的文件

    我在 golang 中有一个服务器可以处理这样的文件夹路径 fs http FileServer http Dir assets http Handle Images fs http ListenAndServe 8000 nil 但在这个
  • 在 Go 中,如何将函数的 stdout 捕获到字符串中?

    例如 在 Python 中 我可以执行以下操作 realout sys stdout sys stdout StringIO StringIO some function prints to stdout get captured in t
  • 正则表达式不匹配

    我正在尝试以下代码 d byte x01 x00 x00 x00 x00 x00 x00 x00 x00 x00 x00 x80J x13 x80SQ x80L xe0 x80 x92 x80L x80H xe0 r regexp Must
  • 数据库连接最佳实践

    我有一个使用 net http 的应用程序 我使用 http 注册了一些处理程序 这些处理程序需要从数据库中获取一些内容 然后才能继续编写响应并完成请求 我的问题是连接到该数据库的最佳实践是什么 我希望它能够以每分钟 1 个请求或每秒 10
  • runtime.LockOSThread 是否允许子 goroutine 在同一个操作系统线程中运行?

    我明白在 Go 中 runtime LockOSThread https golang org pkg runtime LockOSThread将一个 goroutine 绑定到一个操作系统线程 并且不允许其他 goroutine 在该线程
  • 如何在 Visual Studio Code 中为 Golang 启用竞争检测器?

    我搜索了很多网页来找到我应该放入哪个短语settings json在 VS Code Golang 扩展 由 Microsoft 发布 中添加构建标志 在我的例子中是竞赛检测器 I added go buildFlags race 在扩展名
  • Go MSSQL 连接

    如何提供 MSSQL 连接 它说它始终与代码相关 即使信息不正确 也不会报错 package main import database sql fmt github com denisenkom go mssqldb log var ser
  • Golang Appengine 项目无法构建

    我有一个使用 golang 的应用程序引擎项目 我已经大约一年没有碰过了 我现在无法让它在之前构建的机器上构建 我收到以下错误 go app builder 解析输入失败 解析器 src golang org x net internal
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • Go 中的 WebP 编码器/解码器

    是否有一个完整的 WebP 编码器和解码器与当前每周 或可分叉 兼容 它的速度与标准 png 相当吗 这个人在 GitHub 上有一个包 其中包含 WebP 的编码器和解码器 https github com chai2010 webp h
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • 为什么我的 SQL 占位符没有被替换(使用 Go pq)?

    根据文档 我正在这样做 var thingname string asdf var id int err database QueryRow SELECT id from things where thing thingname Scan
  • 按引用或按值扫描功能

    我有以下代码 statement SELECT id from source where mgmt 1 var exists string errUnique dr db QueryRow statement mgmt Scan exist
  • 投射回更专业的界面

    我正在用 Go 编写一个游戏 在 C 中 我将所有实体类存储在 BaseEntity 类的数组中 如果一个实体需要在世界中移动 那么它将是一个从 BaseEntity 派生的 PhysEntity 但添加了方法 我尝试模仿这是 go pac
  • 如何在 Golang 中将 []byte XML 转换为 JSON 输出

    有没有办法在 Golang 中将 XML byte 转换为 JSON 输出 我有以下功能body is byte但我想在一些操作之后将此 XML 响应转换为 JSON 我试过了Unmarshal in xml打包没有成功 POST func
  • Go 无法推断赋值中的类型:“non-name on left side of :=”

    该片段按预期工作play golang org p VuCl OKMav http play golang org p VuCl OKMav i 10 next 11 prev i i next 然而这个几乎相同的片段给出了non name
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • 递归追加到切片不起作用

    我正在尝试学习 Go 但我不明白为什么递归调用堆栈末尾的这段代码返回一个空切片 有帮助吗 还tmp甚至似乎没有在调试器中注册 func main input 3 int 4 6 7 expected 6 7 4 6 7 4 6 4 7 fm
  • 使用 Gorilla 会话自定义后端有什么优势?

    我想使用 Redis 进行会话管理 但我不明白使用 Redis 作为 Gorilla 会话包的自定义后端比直接使用它有什么优势 Gorilla 会话包的链接 http www gorillatoolkit org pkg sessions

随机推荐

  • String.format()方法使用详解技巧

    一 时间切割 String year String format tY 2020 04 30 2020 String month String format tm 2020 04 30 04 String day String format
  • [454]bokeh之bokeh.layouts

    如果希望在同一张图上显示多个图像 可以使用bokeh layouts类中的方法 row column gridplot widgetbox layout row row 的作用是将多个图像以行的方式放到同一张图中 from bokeh io
  • 出现Command ‘locate‘ not found,but can be installed with:apt install mlocate解决方法

    出现Command locate not found but can be installed with apt install mlocate解决方法 在使用Ubuntn出现Command locate not found but can
  • 以太坊区块链浏览器搭建

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 当然 读者若要实践 那么电脑上必须已经搭建好了geth 并且命令 geth version 能显示版本信息 针对以太坊各个链 私链 公链 测试链 都可以用该篇文章来
  • Keil MDK误将Project窗口关了的解决办法,窗口视图重置

    在使用MDK时 误将Project窗口或者其他窗口关了 点击view 选择对应的窗口即可 或者点击Window窗口 选择Reset View to Defaults 再点击Reset即可实现窗口的重置
  • 项目管理:要做一项任务,不要做一堆事儿

    作为项目经理 我们最终的任务和目标是把项目高标准的完成 在完成最终目标的过程中离不开项目成员的协作配合和任务工作的分配 只有项目组成员各司其职 高效的完成各自的工作 才能保证项目的效率和质量 那么如何保证项目组成员在完成各自任务的时候既能保
  • 打包vue前端docker镜像

    1 安装好docker环境 docker v 查看是否成功 2编写Dockerfile文件 下面这个dokcerfile的RUN指令不好 当有多个命令需要执行的时候 可以用换行符和连接符隔开 而不是写多个RUN指令 因为那样会增加镜像的构建
  • Go基础(包、变量和函数):开启Go语言之旅

    开启Go语言之旅 Go编程语言是一个开源项目 可以让程序员提高工作效率 Go是富有表现力 简洁 干净和高效的 其并发机制使编写充分利用多核和联网机器的程序变得容易 而其新颖类型系统则可实现灵活的模块化程序构建 快速编译为机器代码 但具有垃圾
  • apple资讯

    6 月 10 日消息 macOS 12 Monterey 支持通过 AirPlay 将内容发送到第二台 Mac 上 用户还可以使用该功能进行屏幕镜像 将一台备用机器变成一个外部显示器 除了使用 AirPlay 无线方式外 macOS 12
  • MATLAB雷达空时自适应处理

    空时自适应处理是一个用来描述同时处理空域和时域的自适应阵列的术语 信号的空域分量由阵列传感器收集 与所有阵列工作相同 而信号的时域分量用每个阵列传感器后等间隔延时单元产生 为此目的 一个尺寸N阵列有N个子通道 每个传感器后面对应一个 在每个
  • Java Servlet生成Json格式数据

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Java Servlet生成Json格式数据 分类 Web JAVA2013 09 17 14 38 4805人阅读 评论 1 收藏 举报 在Servlet中覆写doGet
  • java 提交表单_http常见的form表单请求方式

    在Web开发中 我们使用的比较多的HTTP请求方式基本上就是GET POST 一 http请求常见的表单文件上传形式 首先了解下application x www form urlencoded和multipart form data的区别
  • 渗透测试-木马免杀的几种方式

    前言 免杀 又叫免杀毒技术 是反病毒 反间谍的对立面 是一种能使病毒或木马免于被杀毒软件查杀的软件 它除了使病毒木马免于被查杀外 还可以扩增病毒木马的功能 改变病毒木马的行为 免杀的基本特征是破坏特征 有可能是行为特征 只要破坏了病毒与木马
  • Ubuntu18.04 编译安装llvm-clang

    背景知识 LLVM和GCC的区别 传统编译器 传统编译器的工作原理基本上都是三段式的 可以分为前端 Frontend 优化器 Optimizer 后端 Backend 前端负责解析源代码 检查语法错误 并将其翻译为抽象的语法树 Abstra
  • ASP.NET WebApi + Autofac 实现依赖注入

    一 项目情况 框架 NET Framework 4 5 Autofac 3 5 0 Autofac WebApi2 4 3 0 二 定义接口与对应实现 接口1 public interface IBaseUserService List
  • 用Jupyter完成numpy、pandas、matplotlib三个库的例题

    文章目录 实验环境 一 numpy例题 二 pandas例题 三 matplotlib例题 四 总结 实验环境 jupyter notebook 一 numpy例题 生成一个一维数组 起始值为5 终点值为15 样本数为10个 import
  • 【转载】使用jsoup替换HTML标记

    原始代码 String html font fsdfs font dfsdf font dasdasd font Document doc Jsoup parse html Elements elements doc select font
  • 【frida逆向开发】frida-rpc远程调用某安app方法获取token

    目录 一 使用fiddler对app进行抓包 二 反编译app定位关键代码 三 frida rpc调用相关方法 一 使用fiddler对app进行抓包 通过抓包可以看到请求参数中X App Token e8f1c71569a7166b6aa
  • AD隐藏元件标号

    1 右键点击元件 不是标号 2 查找相似对象 3 点击应用 4 再点确定 5 把Show Name右边的勾取消
  • Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解

    Go 框架三件套 1 概论 Gorm Gorm 是一个已经迭代了10年 的功能强大的 ORM框架 在字节内部被广泛使用并且拥有非常丰富的开源扩展 Kitex Kitex 是字节内部 Golang 微服务 RPC 框架 具有高性能 强可扩展的