获得徽章 0
- #青训营 x 字节后端训练营# day22 MySQL安装及GORM的增删查改
Golang实践之博客(四) MySQL安装及GORM的增删查改|Go主题月
前言
今天使用Gin作为orm框架完成增删查改
目标
MySQL安装
GORM的简单示例
MySQL安装
windows
下载地址:dev.mysql.com/downloads/m…
image.png
跳过,直接下载
image.png
解压文件
image.png
添加环境变量
image.png
在安装目录新建my.ini文件
输入以下内容,注意替换为自己的安装路径
[mysqld]
basedir=E:\Installation\mysql-8.0.21-winx64\
datadir=E:\Installation\mysql-8.0.21-winx64\data\
管理员权限运行cmd
image.png
执行mysqld -install
mysqld -install
image.png
初始化数据文件
mysqld --initialize-insecure --user=mysql
image.png
启动mysql服务
net start mysql展开评论点赞 - #青训营 x 字节后端训练营# day21orm使用规范&&最佳实践1/4 |Go主题月
gorm使用规范和最佳实践,仅做参考
包/函数管理
model层下,对于每一张表建议使用一个文件进行管理。例如student表:
// student.go
type student struct {
id uint
name string
...
}
func ...{ // student表对应的方法
}
对于方法的管理建议使用controller进行管理起来:
type StudentCtl struct {}
func (s * StudentCtl) QueryStudent(){
...
}
每一个文件中维护一个默认的私有controller,将获取controller的方法暴露给其他包/文件:
var sc StudentCtl
func GetStudentCtl() *StudentCtl {
return &sc
}
为什么需要Ctl?Ctl方便对表内方法进行管理,清晰的告诉其调用者,这是一个model层的方法,是数据库操作相关方法,需要考虑事务等数据库操作相关的问题,而不是一个普通函数。 Ctl也有助于在考虑实现功能时进行方法的解耦。
数据库连接
Peter Bourgon在[Translation]现代GO的一些理论中认为不应当产生包级别变量,而是应该将诸如数据库连接变量传递,事实上这也是事务控制所必须的方法。 个人建议在model层/包下维护全局变量db,直接使用db进行查询,但是禁止对db进行赋值(数据库连接一旦被赋值可能造成非常严重的后果,例如db = nil):
// model 包下
var db *gorm.DB
func initDB (){
db,err = gorm.Open()
...
}
对于特定数据库连接,例如事务控制tx,可以对其进行返回来避免数据库连接的覆盖,以及在需要事务的时候进行事务控制:展开评论点赞 - #青训营 x 字节后端训练营# day20Go设计模式(21)-职责链模式
Go设计模式(21)-职责链模式
本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!
职责链将处理模块串联成链,请求沿着链条被处理,提供了很好的扩展性,而且能够去掉if-else。
UML类图位置:www.processon.com/view/link/6…
本文代码链接为:github.com/shidawuhen/…
1.定义
1.1职责链模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
UML:
图片
1.2分析
职责链模式的定义已经将模式说的比较清楚了,一个请求需要被多个对象进行处理,可以将处理对象连成一条链,挨个处理请求。
连成链的方式比较多样,可以用UML中展示的那样,一个处理对象使用SetSuccessor引用下一个处理对象。也可以使用array或者list存储所有处理对象,使用循环方式遍历。
对于第二种方式,是否感觉有些像Go设计模式(18)-观察者模式。两者具体实现、目的都差不多,主要区别在观察者模式中的处理对象功能可能完全不相似,而且观察者模式主要负责将信息传递给处理对象即可。职责链模式的处理对象功能一般相似,另外职责链模式也关注请求是否正确被处理。
另外,定义里说”直到有一个对象处理它“也不太准确,有多少对象可以处理请求看具体需求,极端情况下每一个对象都可以处理请求。
职责链模式的核心在于将处理对象整理成链路。
2.应用场景
如果请求被多个对象进行处理,就可以用职责链模式。具体业务的像敏感词脱敏,框架中的过滤器、拦截器等。
总体感觉框架中使用的比较多一些,研发人员能够快速扩展出自己的过滤器和拦截器。
以前写过Gin源码剖析,里面有全局中间件的概念,而全局中间件使用的便是职责链模式。展开评论点赞 - #青训营 x 字节后端训练营# day19Go工具之generate
Go工具之generate
本文给大家介绍Go的一个实用技巧,该技巧主要通过go工具实现。
传统写法
大家经常碰到命名错误码、状态码的同时,又要同步写码对应的翻译,有没有感觉很无聊。这里举一个例子:
package main
import "fmt"
// 定义错误码
const (
ERR_CODE_OK = 0 // OK
ERR_CODE_INVALID_PARAMS = 1 // 无效参数
ERR_CODE_TIMEOUT = 2 // 超时
)
// 定义错误码与描述信息的映射
var mapErrDesc = map[int]string{
ERR_CODE_OK: "OK",
ERR_CODE_INVALID_PARAMS: "无效参数",
ERR_CODE_TIMEOUT: "超时",
}
// 根据错误码返回描述信息
func GetDescription(errCode int) string {
if desc, exist := mapErrDesc[errCode]; exist {
return desc
}
return fmt.Sprintf("error code: %d", errCode)
}
func main() {
fmt.Println(GetDescription(ERR_CODE_OK))
}
这是一种重复性操作,没有什么技术含量,另外很可能忘记写映射。我只想写错误码,对应的描述信息直接用注释里的就行,所以这里介绍一下对应的工具。
go generate
go有很多工具,大家可以通过go命令查看。

go generate是 Go 自带的工具展开评论点赞 - 并发组件 | Go设计模式实战
嗯,Go设计模式实战系列,一个设计模式业务真实使用的golang系列。
前言
本系列主要分享,如何在我们的真实业务场景中使用设计模式。
本系列文章主要采用如下结构:
什么是「XX设计模式」?
什么真实业务场景可以使用「XX设计模式」?
怎么用「XX设计模式」?
本文主要介绍「组合模式」结合Go语言天生的并发特性,如何在真实业务场景中使用。
之前文章《代码组件 | Go设计模式实战》已经介绍了「组合模式」的概念,以及在业务中的使用。今天我们结合Go语言天生的并发特性,升级「组合模式」为「并发组合模式」。
我们先来简单回顾下「组合模式」的知识,详细可以查看上篇文章《代码组件 | Go设计模式实战》
什么是「并发组合模式」?
组合模式的概念:
一个具有层级关系的对象由一系列拥有父子关系的对象通过树形结构组成。
并发组合模式的概念:
一个具有层级关系的对象由一系列拥有父子关系的对象通过树形结构组成,子对象即可被串行执行,也可被并发执行
并发组合模式的优势:
原本串行的业务(存在阻塞的部分,比如网络IO等)可以被并发执行,利用多核优势提升性能。
什么真实业务场景可以用「并发组合模式」?
我们还是以「组合模式」中的“订单结算页面”为例,继续来看看某东的订单结算页面:
从页面的展示形式上,可以看出:
页面由多个模块构成,比如:
地址模块:获取用户地址数据
支付方式模块:获取支付方式列表
店铺模块:获取店铺、购物车选中商品等信息
发票模块:获取发票类型列表
优惠券模块:获取用户优惠券列表
某豆模块:获取用户积分信息
礼品卡模块:获取礼品卡列表列表
订单详细金额模块:获取订单金额信息
单个模块可以由多个子模块构成
店铺模块,又由如下模块构成:
商品模块:获取购物车选中商品信息
售后模块:获取商品售后信息
优惠模块:获取商品参与的优惠活动信息
物流模块:获取商品支持的配送方式列表
按照「组合模式」的业务逻辑执行流程:展开评论点赞 - #青训营 x 字节后端训练营# day15为Go配置JSON
为Go配置JSON
大多数现代应用程序需要在多个服务之间进行通信,而JSON是在网络上存储和传输数据的最流行的符号之一。在这篇文章中,我们将探讨如何在Go中使用JSON,这是一种流行的开源语言。
让我们开始吧!
JSON简介
JSON,即JavaScript对象符号,是一种用于存储、发送和接收信息的流行文本格式。由于JSON的结构简单,使用有序列表格式化为键值对,因此很容易编写和理解。
JSON是独立于语言的,这意味着它可以与任何编程语言一起使用。许多语言都有对JSON的内置支持。
让我们通过一个例子来看看JSON格式是什么样子的!在下面的代码块中,JSON对象代表一个网络应用的用户。
{
"firstname": "Mohit",
"lastname": "Khare",
"id": "mkfeuhrer",
"age": "24",
"gender": "male",
"preferred_topics": ["startups", "books", "chess", "blogging"],
"social_links": [
{
"site": "twitter",
"url": "twitter.com"
}
]
}
根据JSON格式模式的定义方式,JSON的键必须是一个字符串。然而,值可以是一个字符串,一个对象,或一个字符串或对象的列表。展开评论点赞 - #青训营 x 字节后端训练营# day14
Go 语言官方库给我们一贯的印象是:强大、好用。但是,金无足赤,人无完人,在一些性能要求苛刻的场景例如 json 解析,某些官方库的表现不尽如人意。
本文介绍几个对标官方库的开源库,它们的性能远超前者。当读者在使用这些官方库遇到性能问题时,可以尝试替换优化。
net/http -> fasthttp
地址:github.com/valyala/fas…
fasthttp号称比net/http快十倍,其优化的核心思路很简单:资源复用。
复用 goroutine,减轻 runtime 调度压力;
对象复用,大量使用 sync.Pool 减轻 GC 压力。
除了复用,还有其他的一些优化手段,例如尽量避免 string 与 []byte 的转换开销等。
这些优化技巧和最佳实践,在其 Github 主页上已经贴心给出:_github.com/valyala/fas…
因为fasthttp的实现与标准库差距较大,所以它与net/http的 API 接口是不同的,这导致从net/http重构为fasthttp需要一些学习成本。
使用fasthttp的知名项目:Fiber、Gearbox、atreugo 等。
encoding/json -> jsoniter
地址:github.com/json-iterat…
jsoniter(json-iterator)是一款快且灵活的 JSON 解析器,同时提供 Java 和 Go 两个版本。官方称 Golang 版本可以比标准库(encoding/json)快 6 倍之多。展开评论点赞 - 说Go语言国内比较火,应该没有人反对,但是国内的开源项目却没有太多值得被推
崇。
今天在github的trending页 面浏览了一下本月Go语言比较流行的项目,
不知道github
官方判断的依据是啥,姑且先认为在上面都是有一定的流行或者即将流行的项目。
在我看来真正有价值的并不多,比如说关于面试的,关于资料汇总的等等,我井不认为这些能够体现国人使用Go语言的项目经验多或者技能强,至少人github的维度无法得出,然后结合我工作中使用,我找了5个在我看来还比较有价值的项目,在这里分享给大家。
优秀的项目应该让大家都能知道,希望大家也能分享Go语言方面国内的精品项目。
筛选标准:好玩,有意义,有深度。
1、面试,刷题类不要,如go-interview
2、笔記博客类不要
3、分享类不要,如Go夜读
Yearning SQL車核平台(star #青训营 x 字节后端训练营#展开评论点赞 - #青训营 x 字节后端训练营# day13说Go语言国内比较火,应该没有人反对,但是国内的开源项目却没有太多值得被推崇。
今天在github的trending页面浏览了一下本月Go语言比较流行的项目,不知道github官方判断的依据是啥,姑且先认为在上面都是有一定的流行或者即将流行的项目。
在我看来真正有价值的并不多,比如说关于面试的,关于资料汇总的等等,我并不认为这些能够体现国人使用Go语言的项目经验多或者技能强,至少从github的维度无法得出,然后结合我工作中使用,我找了5个在我看来还比较有价值的项目,在这里分享给大家。
优秀的项目应该让大家都能知道,希望大家也能分享Go语言方面国内的精品项目。
。展开评论点赞