Golang
文章平均质量分 64
本专栏主要介绍 golang 相关的常见内容 和 核心技能
昕光xg
专注于容器K8S、AI、机器人生态
展开
-
gin框架39--重构 BasicAuth 中间件
每当我们打开一个网址的时候,会自动弹出一个认证界面,要求我们输入用户名和密码,这种BasicAuth是最基础、最常见的认证方式,gin框架中提供了一种内置的方式,但它只能用内置的用户和密码,无法使用外部db中的用户和密码,这种方式很多时候是不友好的。为此,本文根据gin.BasicAuth的原理对其就行重构,实现一个简单的newAuth中间件,该中间件可以代替默认的BasicAuth,并且可以按需更改为自定义查询函数,实现从外部db或者用户管理系统查询信息实现登录认证的功能。原创 2023-10-20 12:52:25 · 1313 阅读 · 0 评论 -
golang笔记18--go并发多线程
大家都知道go语言近年来越来越火了,其中有一个要点是go语言在并发场景有很高的性能,比如可以通过启动很多个 goroutine 来执行并发任务,通过Channel 类型实现 goroutine 之间的数据交流。当我们想用go实现高并发的时候,我们要了解常见的并发源语,以便于开发的时候做出最优选择。本文基于较新版本的go1.20.7, 介绍了go并发多线场景常用的源语和方法案例…原创 2023-10-20 11:05:20 · 1046 阅读 · 1 评论 -
golang笔记17--编译调试go源码
在 fmt.print.go 中新增 PrintlnXG 函数,如下重新编译生成 bin/go 二进制文件;")执行后,成功输出 hello PrintlnXG, add by xg 了,如下图。原创 2023-10-20 10:23:33 · 586 阅读 · 0 评论 -
gorm基础06--CRUD 接口-删除
gorm基础06--CRUD 接口-删除介绍案例注意事项说明介绍上文 gorm基础05–CRUD 接口-更新 介绍了gorm 中常见的更新操作,本文继上文继续介绍gorm中常见的删除操作,具体包括 删除一条记录、根据主键删除、批量删除、返回删除行的数据、软硬删除 等。案例deleteOne(db) 删除一条记录deleteByPrimaryKey(db) 根据主键删除deleteBatch(db) 批量删除deleteWithReturnData(db) 返回删除行的数据delet原创 2022-04-17 22:49:33 · 1337 阅读 · 0 评论 -
gorm基础05--CRUD 接口-更新
gorm基础05--CRUD 接口-更新介绍案例说明介绍上文 gorm基础04–CRUD 接口-查询 介绍了gorm 中常见查询方法,本文继续介绍gorm中常见的更新方法。具体包括 保存所有字段、更新单个列、更新多个列、更新选定字段、批量更新 等。案例updateAllFields(db) 保存所有字段updateSingleField(db) 更新单个列updateMultiFields(db) 更新多个列updateSelectedFields(db) 更新选定字段updateB原创 2022-04-16 17:55:57 · 1095 阅读 · 0 评论 -
gorm基础04--CRUD 接口-查询
gorm基础04--CRUD 接口-查询介绍案例说明介绍上文 gorm基础03–CRUD 接口-创建 介绍了gorm 中创建表和记录的多种方法,本文继续介绍gorm 中常见的查询方法。具体包括 检索单个对象、用主键检索、检索全部对象、通过字符串条件搜索、通过Struct|map条件搜索 等。案例检索单个对象 searchSingle用主键检索 searchByPrimaryKey检索全部对象 searchAll通过字符串条件搜索 searchStrCondition通过Struct|原创 2022-04-15 00:57:39 · 537 阅读 · 0 评论 -
gorm基础03--CRUD 接口-创建
gorm基础03--CRUD 接口-创建介绍案例说明介绍gorm基础02–人门指南-连接到数据库 介绍了gorm 连接数据库的方法,本文继上问继续介绍常见的创建数据记录的方法,具体包括创建表、插入数据、批量插入数据、通过map方式插入数据等。案例在gorm中,表名是结构体名的复数形式,列名是字段名的蛇形小写。即,如果有一个user表,那么如果你定义的结构体名为:User,gorm会默认表名为users而不是user。如果需要创建单数的表,那么需要在 gorm.Config中配置 Sing原创 2022-04-13 00:36:47 · 1171 阅读 · 3 评论 -
gorm基础02--入门指南-连接到数据库
gorm基础02--人门指南-连接到数据库介绍案例说明介绍GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server. 本文主要通过mysql 来介绍 gorm最基本的连接数据库方法、以及其连接池的使用方法。案例源码:package mainimport ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "time")func getDb01() *gorm.DB { dsn := "原创 2022-04-11 23:45:30 · 1671 阅读 · 0 评论 -
gorm基础01--入门指南-概述
# 介绍gorm是一个神奇的,对开发人员友好的 Golang ORM 库,其功能全面,具体包括如下特性:* 全功能 ORM (几乎包含所有特性)* 模型关联 (一对一, 一对多,一对多(反向), 多对多, 多态关联,单表继承)* 钩子 (包括 Before/After Create/Save/Update/Delete/Find)* 支持 Preload、Joins 的预加载* 事务,嵌套事务,Save Point,Rollback To Saved Point* Context、预编译模式原创 2022-04-05 21:27:56 · 906 阅读 · 0 评论 -
gin框架38--使用中间件
gin框架15--使用中间件介绍案例说明介绍本文主要介绍如何在gin框架中使用中间件,并通过案例加以说明。使用MyBenchLogger中间件来输出特有的日志,用AuthRequire中间件来实现基础认证。原创 2022-04-04 11:08:40 · 580 阅读 · 0 评论 -
gin框架-37--HTTP2 server 推送
gin框架37--HTTP2 server 推送介绍案例说明介绍本文主要介绍 HTTP2 server 推送。服务器推送(server push)指的是,还没有收到浏览器的请求,服务器就把各种资源推送给浏览器。比如,浏览器只请求了index.html,但是服务器把index.html、style.css、example.png全部发送给浏览器。这样的话,只需要一轮 HTTP 通信,浏览器就得到了全部资源,提高了性能。下图为一个简单http请求的过程,左边没有使用push, 每个资源都会先请求再原创 2022-04-03 17:58:48 · 2215 阅读 · 1 评论 -
gin框架36--静态资源嵌入
gin框架36--静态资源嵌入介绍案例说明介绍本文主要介绍gin框架中如何使用静态资源嵌入。案例源码:vim main.gopackage mainimport ( "html/template" "io/ioutil" "net/http" "strings" "github.com/gin-gonic/gin")func main() { r := gin.New() t, err := loadTemplate() if err != nil { panic原创 2022-04-03 17:17:16 · 1231 阅读 · 0 评论 -
gin框架35--静态文件服务
gin框架35--静态文件服务介绍案例说明介绍本文介绍了如何使用gin框架实现静态文件服务,并加以案例说明。案例源码:package mainimport ( "github.com/gin-gonic/gin" "net/http")func main() { router := gin.Default() router.Static("/assets", "./assets") router.StaticFS("/more_static", http.Dir("/var/l原创 2022-04-03 15:14:14 · 2413 阅读 · 0 评论 -
gin框架34--重定向
gin框架34--重定向介绍案例说明介绍本文主要介绍gin框架中的重定向, HTTP 重定向很容易。 内部、外部重定向均支持。案例源码:package mainimport ( "github.com/gin-gonic/gin" "net/http")func main() { r := gin.Default() //通过 GET 方法进行 HTTP 重定向 r.GET("/test", func(c *gin.Context) { c.Redirect(http.S原创 2022-04-03 14:45:23 · 2549 阅读 · 0 评论 -
gin框架33--运行多个服务
gin框架33--运行多个服务介绍案例说明介绍本文介绍如何在gin框架中 运行多个服务, 每个服务对应不同的端口。案例源码:package mainimport ( "log" "net/http" "time" "github.com/gin-gonic/gin" "golang.org/x/sync/errgroup")var ( g errgroup.Group)func router01() http.Handler { e := gin.New() e.原创 2022-04-03 14:27:48 · 1302 阅读 · 0 评论 -
gin框架32--路由组
gin框架32--路由组介绍案例说明介绍本文主要介绍gin框架中的 路由组, 以及相关案例和测试结果。案例源码:package mainimport "github.com/gin-gonic/gin"func loginEndpoint(c *gin.Context) { c.String(200, c.Request.URL.String())}func submitEndpoint(c *gin.Context) { c.String(200, c.Request.URL.原创 2022-04-03 14:12:19 · 333 阅读 · 0 评论 -
gin框架31--路由参数
gin框架31--路由参数介绍案例说明介绍本文介绍gin框架中哦的路由参数。案例源码:package mainimport ( "github.com/gin-gonic/gin" "net/http")func main() { r := gin.Default() // 此 handler 将匹配 /user/john 但不会匹配 /user/ 或者 /user r.GET("/user/:name", func(c *gin.Context) { name := c原创 2022-04-03 12:35:51 · 594 阅读 · 0 评论 -
gin框架30--设置和获取 Cookie
gin框架30--设置和获取 Cookie介绍案例说明介绍本文主要介绍如何在gin框架中设置和获取 Cookie,并加以案例说明。案例源码:package mainimport ( "fmt" "github.com/gin-gonic/gin")func main() { r := gin.Default() r.GET("/cookie", func(c *gin.Context) { cookie, err := c.Cookie("gin_cookie") if原创 2022-04-03 00:13:53 · 1768 阅读 · 0 评论 -
gin框架29--自定义验证器
gin框架29--自定义验证器介绍案例说明介绍本文介绍了如何在gin框架中自定义验证器,并加以案例说明。案例源码:package mainimport ( "net/http" "time" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/go-playground/validator/v10")// Booking 包含绑定和验证的数据。type Booking struc原创 2022-04-01 00:28:23 · 1472 阅读 · 0 评论 -
gin框架28--自定义中间件
gin框架28--自定义中间件介绍案例说明介绍本文主要介绍如何在gin框架中使用自定义的中间件,自出以为自定义logger为例子。案例源码:package mainimport ( "github.com/gin-gonic/gin" "log" "time")func Logger() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() // 设置 example 变量 c.Set("ex原创 2022-03-30 00:05:30 · 595 阅读 · 0 评论 -
gin框架27--自定义 HTTP 配置
gin框架27--自定义 HTTP 配置介绍案例说明介绍本文主要介绍如何自定义HTTP配置, 在gin框架中可以直接使用 http.ListenAndServe()来实现。案例源码:package mainimport ( "github.com/gin-gonic/gin" "net/http" "time")func test01() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.String(原创 2022-03-29 23:44:22 · 985 阅读 · 0 评论 -
gin框架26--绑定表单数据至自定义结构体
gin框架26--绑定表单数据至自定义结构体介绍案例说明介绍本文介绍 如何绑定表单数据至自定义结构体,并加以案例说明。案例源码:package mainimport "github.com/gin-gonic/gin"type StructA struct { FieldA string `form:"field_a"`}type StructB struct { NestedStruct StructA FieldB string `form:"field_b"`原创 2022-03-29 23:34:16 · 606 阅读 · 0 评论 -
gin框架25--绑定查询字符串或表单数据
gin框架25--绑定查询字符串或表单数据介绍案例说明介绍本文介绍gin框架中如何绑定查询字符串或表单数据,并加以案例说明。案例源码:package mainimport ( "log" "time" "github.com/gin-gonic/gin")type Person struct { Name string `form:"name"` Address string `form:"address"` Birthday time.Time `f原创 2022-03-29 08:25:35 · 449 阅读 · 0 评论 -
gin框架24--绑定 Uri
gin框架24--绑定 Uri介绍案例说明介绍本文介绍如何在gin框架中绑定 Uri,即在Uri 中传入指定的参数。案例源码:package mainimport "github.com/gin-gonic/gin"type Person struct { ID string `uri:"id" binding:"required,uuid"` Name string `uri:"name" binding:"required"`}func main() { r := gi原创 2022-03-29 08:14:14 · 759 阅读 · 0 评论 -
gin框架23--绑定 HTML 复选框
gin框架23--绑定 HTML 复选框介绍案例说明介绍本文通过一个简单的案例,将结构体和html中的 form 数据绑定在一起。案例源码:main.gopackage mainimport ( "github.com/gin-gonic/gin")type myForm struct { Colors []string `form:"colors[]"`}func main() { r := gin.Default() r.LoadHTMLGlob("views/*"原创 2022-03-29 00:32:55 · 681 阅读 · 0 评论 -
gin框架22--模型绑定和验证
gin框架22--模型绑定和验证介绍案例说明介绍案例说明gin官方文档 模型绑定和验证原创 2022-03-29 00:16:51 · 985 阅读 · 0 评论 -
gin框架21--查询字符串参数
gin框架21--查询字符串参数介绍案例说明介绍本文介绍了如何查询字符串参数,然后在应用中使用url 传入的参数。案例源码:package mainimport "github.com/gin-gonic/gin"func main() { r := gin.Default() r.GET("/welcome", func(c *gin.Context) { firstname := c.DefaultQuery("firstname", "Guest") lastname :原创 2022-03-26 19:05:17 · 876 阅读 · 0 评论 -
gin框架20--映射查询字符串或表单参数
gin框架20--映射查询字符串或表单参数介绍案例说明介绍本文主要介绍如何映射查询字符串或表单参数, 通过 c.QueryMap 获取查询字符串,通过 c.PostFormMap 获取表单字符串。案例源码:package mainimport ( "fmt" "github.com/gin-gonic/gin")func main() { r := gin.Default() r.POST("/post", func(c *gin.Context) { ids := c.Qu原创 2022-03-26 18:52:35 · 491 阅读 · 0 评论 -
gin框架19--控制日志输出颜色
gin框架19--控制日志输出颜色介绍案例说明介绍本文主要介绍如何控制日志输出颜色, 代码运行后会根据检测到的 TTY,控制台的日志输出默认是有颜色的。案例源码:package mainimport "github.com/gin-gonic/gin"func test01() { // 禁止日志的颜色 gin.DisableConsoleColor() // 用默认中间件创建一个 gin 路由: // 日志和恢复(无崩溃)中间件 router := gin.Default()原创 2022-03-26 17:48:56 · 1116 阅读 · 0 评论 -
gin框架18--将 request body 绑定到不同的结构体中
gin框架18--将 request body 绑定到不同的结构体中介绍案例说明介绍案例案例1: 使用 c.ShouldBind, 但不可重用package mainimport ( "github.com/gin-gonic/gin" "net/http")type formA struct { Foo string `json:"foo" xml:"foo" binding:"required"`}type formB struct { Bar string `json:原创 2022-03-26 17:30:54 · 1428 阅读 · 0 评论 -
gin框架17--定义路由日志的格式
gin框架17--定义路由日志的格式介绍案例说明介绍本文主要介绍如何定义路由日志的格式, 而非使用默认的路由日志格式。案例源码:package mainimport ( "github.com/gin-gonic/gin" "log" "net/http")func main() { r := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nu原创 2022-03-26 16:52:08 · 624 阅读 · 0 评论 -
gin框架16--如何记录日志
gin框架16--如何记录日志介绍案例说明介绍本文主要介绍如何将日志写入文件中,取消终端输出。案例源码:package mainimport ( "github.com/gin-gonic/gin" "io" "os")func main() { gin.DisableConsoleColor() f, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(f) //gin.DefaultWriter =原创 2022-03-25 22:50:10 · 1641 阅读 · 0 评论 -
gin框架15--在中间件中使用 Goroutine
gin框架15--在中间件中使用 Goroutine介绍案例说明介绍本案例中介绍了如何在中间件中使用 Goroutine。案例当在中间件或 handler 中启动新的 Goroutine 时,不能使用原始的上下文,必须使用只读副本。源码:package mainimport ( "github.com/gin-gonic/gin" "log" "time")func main() { r := gin.Default() r.GET("/long_async", func(c原创 2022-03-25 22:25:19 · 889 阅读 · 0 评论 -
gin框架14--使用 BasicAuth 中间件
gin框架14--使用 BasicAuth 中间件介绍案例说明介绍本文主要介绍gin框架中的 basicauth 认证模块,通过BasicAuth中间件可以快速实现 http 基础认证,提高应用安全性。案例源码package mainimport "github.com/gin-gonic/gin"// 模拟一些私人数据var secrets = gin.H{ "foo": gin.H{"email": "foo@bar.com", "phone": "123433"}, "a原创 2022-03-24 22:16:36 · 1449 阅读 · 0 评论 -
gin框架13--优雅地重启或停止
gin框架13--优雅地重启或停止介绍案例使用endless 来优雅重启使用 http.Server 内置的 Shutdown() 方法优雅地关机注意事项说明介绍本文主要介绍 gin框架中重启或者停止的方案。常见的包括替换 ListenAndServe、manners、graceful、grace 等,go1.8可以考虑使用 http.Server 内置的 Shutdown() 方法优雅地关机。案例使用endless 来优雅重启源码:package mainimport ( "github原创 2022-03-24 08:29:41 · 2366 阅读 · 0 评论 -
gin框架12--从 reader 读取数据
gin框架12--从 reader 读取数据介绍案例说明介绍本文介绍gin框架如何 从 reader 读取数据,并加以案例说明。案例源码:package mainimport ( "github.com/gin-gonic/gin" "net/http")func main() { router := gin.Default() router.GET("/someDataFromReader", func(c *gin.Context) { response, err :=原创 2022-03-24 00:21:41 · 1317 阅读 · 0 评论 -
gin框架11--上传文件
gin框架11--上传文件介绍案例说明介绍本节列出了上传文件的 api 用法,具体包括同时上传单个文件和同时上传多个文件,并将文件保存到项目当前目录。案例源码:package mainimport ( "fmt" "github.com/gin-gonic/gin" "log")func main() { r := gin.Default() // 为 multipart forms 设置较低的内存限制 (默认是 32 MiB) r.MaxMultipartMemory =原创 2022-03-23 23:39:28 · 1329 阅读 · 0 评论 -
gin框架10--XML/JSON/YAML/ProtoBuf 渲染
gin框架10--XML/JSON/YAML/ProtoBuf 渲染介绍案例说明介绍本文主要介绍gin 中的 XML/JSON/YAML/ProtoBuf 等常见渲染方法。案例源码:测试:说明gin官方文档 XML/JSON/YAML/ProtoBuf 渲染原创 2022-03-23 08:25:43 · 878 阅读 · 0 评论 -
gin框架09--SecureJSON
gin框架09--SecureJSON介绍案例说明介绍本文主要介绍 gin框架中的 SecureJSON,使用 SecureJSON 防止 json 劫持。如果给定的结构是数组值,则默认预置 “while(1),” 到响应体。案例源码:package mainimport "github.com/gin-gonic/gin"type User struct { Name string Age int}func main() { r := gin.Default() r.GE原创 2022-03-22 23:24:08 · 618 阅读 · 0 评论 -
gin框架08--Query 和 post form
gin框架08--Query 和 post form介绍案例说明介绍本文主要介绍 Query 和 post form,并配上相关案例加以理解。通过Query方法可以获取url 中? 之后的请求参数,通过PostForm方法可以获取到Post 的数据。案例源码:package mainimport ( "github.com/gin-gonic/gin")func main() { r := gin.Default() r.POST("/post", func(c *gin.Con原创 2022-03-22 23:05:44 · 1174 阅读 · 0 评论