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 数据库框架三件套用法详解 的相关文章

  • 在 Go 中使用互斥锁

    我想了解互斥体是如何工作的 据我目前的理解 它是为了进行原子操作并同步对某些数据的访问 我在这里构建了一个队列数据结构的示例 https github com arnauddri algorithms blob master data st
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • 当涉及多个渠道时,select 如何工作?

    我发现在多个非缓冲通道上使用 select 时 例如 select case lt chana case lt chanb 即使两个通道都有数据 但在处理此选择时 case chana 和 case chanb 的跟注不平衡 package
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • Go io.Pipe 的缓冲版本

    有缓冲版本吗io Pipe https golang org pkg io Pipe 在标准库或第三方库中 在我推出自己的库之前 上下文 我正在尝试使用这个解决方案 https stackoverflow com a 36229262 15
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • 解组转义 XML

    在 Go 中 我将如何解码此 XML 响应 我尝试过建立一个自定义UnMarshal方法在我的Answerstruct 但我运气不太好
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 如何修复“缺少表的 FROM 子句条目”错误

    我正在尝试根据游戏 ID 获取平台名称 我有如下三个表 我正在尝试加入它们以获得所需的结果 Games Id 1 2 3 4 Game Platforms Id game id platform id 1 1 1 2 1 2 3 3 3
  • 如何将接口转换为接口切片?

    我的输入是interface 而且我知道它可以是任何类型的数组 我想读取我输入的元素之一 所以我尝试将我的interface 进入一个 interface 但是 go 会给我以下错误 恐慌 接口转换 interface 是 map stri
  • 错误:标准包中非标准导入“gopkg.in/yaml.v2”

    我正在尝试从以下位置导入 go yamlhttps github com go yaml yaml https github com go yaml yaml 并且我发现了一个 Google 没有提供帮助的错误 I ran go get g
  • 什么时候返回结构体指针是个好主意?

    我正在学习 Go 我对何时使用指针有点困惑 具体来说 当返回一个struct从函数中 什么时候适合返回结构体实例本身 什么时候适合返回指向结构体的指针 示例代码 type Car struct make string model strin
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • golang.org 包和标准库之间的区别

    我使用 go 已经有一段时间了 我注意到 Go 标准库 和 golang org x 之间存在重复的包 我的问题是 为什么它们被释放两次 在这两者中 我应该使用哪一个 更新的 规范的等 到目前为止我注意到的一些示例包已发布两次 golang
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui

随机推荐

  • 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 框架 具有高性能 强可扩展的