![](https://img-blog.csdnimg.cn/288ae854897841bfa6ab242d86c4b6b3.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Go
文章平均质量分 76
Go语言实战练习学习
世界尽头与你
一个懂安全的开发者
展开
-
Go语言日志美化库,slog使用指南
slog 也内置了 JSON 格式的 Formatter。若不特别指定,默认都是使用 TextFormatter 格式化日志记录。slog是Go 实现的一个易于使用的,易扩展、可配置的日志库。slog 使用非常简单,无需任何配置即可使用。原创 2024-01-09 12:38:52 · 853 阅读 · 0 评论 -
Go语言基本数据类型
如果第一个字节的高端bit为0,则表示对应7bit的ASCII字符,ASCII字符每个字符依然是一个字节,和传统的ASCII编码兼容。同样,一个字符串s和对应的子字符串切片s[7:]的操作也可以安全地共享相同的内存,因此字符串切片操作代价也是低廉的。考虑下面的这个例子中的字符串,它混合了中西两种字符,为了处理这些真实的字符,我们需要一个UTF8解码器。在原生的字符串面值中,没有转义操作;一个常量的声明语句定义了常量的名字,和变量的声明语法类似,常量的值不可修改,这样可以防止在运行期被意外或恶意的修改。原创 2024-01-04 14:58:27 · 1053 阅读 · 0 评论 -
gookit/color - Go语言命令行色彩使用库教程
4、直接设置控制台属性。原创 2024-01-02 16:46:05 · 717 阅读 · 0 评论 -
Go语言命令行参数及cobra使用教程
可以指定位置参数的验证:NoArgs- 如果有任何位置参数,则报告错误。ArbitraryArgs- 接受任意数量的参数。MinimumNArgs(int)- 如果提供的位置参数少于 N 个,则报告错误。MaximumNArgs(int)- 如果提供了超过 N 个位置参数,则报告错误。ExactArgs(int)- 如果位置参数不完全是 N 个,则报告错误。RangeArgs(min, max)- 如果参数数不在min和max之间,则报告错误。原创 2024-01-02 15:11:35 · 2019 阅读 · 0 评论 -
Go语言module,依赖管理方法
1、在初始化项目时,会生成一个 go.mod 文件go 1.13require (module:用于定义当前项目的模块路径。go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。require:用于设置一个特定的模块版本。exclude:用于从使用中排除一个特定的模块版本。replace:用于将一个模块版本替换为另外一个模块版本。原创 2024-01-02 12:30:55 · 1357 阅读 · 0 评论 -
在Gin框架中使用JWT
/ CustomClaims 自定义声明类型 并内嵌jwt.RegisteredClaims // jwt包自带的jwt.RegisteredClaims只包含了官方字段 // 假设我们这里需要额外记录一个username字段,所以要自定义结构体 // 如果想要保存更多信息,都可以添加到这个结构体中 type CustomClaims struct {原创 2023-03-14 10:24:41 · 628 阅读 · 0 评论 -
Go单元测试基础
编写好的测试并非易事,但在许多情况下,表格驱动测试可以涵盖很多方面:表格里的每一个条目都是一个完整的测试用例,包含输入和预期结果,有时还包含测试名称等附加信息,以使测试输出易于阅读。通常我们使用的都是语句的覆盖率,也就是在测试中至少被运行一次的代码占总代码的比例。文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。原创 2023-03-14 09:22:33 · 269 阅读 · 0 评论 -
Gin框架路由拆分与注册详解析
因此我们在项目目录下单独定义一个app目录,用来存放我们不同业务线的代码文件,这样就很容易进行横向扩展。有时候项目规模实在太大,那么我们就更倾向于把业务拆分的更详细一些,例如把不同的业务代码拆分成不同的APP。当我们的业务规模继续膨胀,单独的一个routers文件或包已经满足不了我们的需求了。因为我们把所有的路由注册都写在一个SetupRouter函数中的话就会太复杂了。下面最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo。原创 2023-03-11 17:06:33 · 648 阅读 · 0 评论 -
【GORM】链式操作相关
在调用立即执行方法前不会生成Query语句,借助这个特性你可以创建一个函数来处理一些通用逻辑。立即执行方法是指那些会立即生成SQL语句并发送到数据库的方法。基于它,你可以抽取一些通用逻辑,写出更多可重用的函数库。Scopes,Scope是建立在链式操作的基础之上的。原创 2023-03-10 18:31:46 · 363 阅读 · 0 评论 -
【GORM】高级查询方案
获取匹配的第一条记录, 否则根据给定的条件创建一个新的记录 (仅支持 struct 和 map 条件)Pluck,查询 model 中的一个列作为切片,如果您想要查询多个列,您应该使用 Scan。Select,指定你想从数据库中检索出的字段,默认会选择全部字段。Offset,指定开始返回记录前要跳过的记录数。Count,该 model 能获取的记录总数。Limit,指定从数据库检索出的最大记录数。Scan,扫描结果至一个 struct。Joins,指定连接条件。原创 2023-03-10 17:54:10 · 1355 阅读 · 0 评论 -
Go语言基础之Error接口
所以我们通常将调用函数返回的错误与nil进行比较,以此来判断函数是否返回错误。当一个函数或方法需要返回错误时,我们通常是把错误作为最后一个返回值。我们可以根据需求自定义 error,最简单的方式是使用errors 包提供的New函数创建一个错误。Go 语言中把错误当成一种特殊的值来处理,不支持其他语言中使用。但是上面的方式会丢失原有的错误类型,只拿到错误描述的文本信息。,可以实现基于已有的错误再包装得到一个新的错误。,这个函数需要返回一个描述错误信息的字符串。当我们需要传入格式化的错误描述信息时,使用。原创 2023-03-09 20:33:53 · 452 阅读 · 0 评论 -
Go语言基础之接口
一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。接口就是规定了一个需要实现的方法列表,在 Go 语言中一个类型只要实现了接口中规定的所有方法,那么我们就称它实现了这个接口。因为Singer接口只包含一个Sing方法,所以只需要给Bird结构体添加一个Sing方法就可以满足Singer接口的要求。这样我们在代码中就可以把狗和汽车当成一个会动的类型来处理,不必关注它们具体是什么,只需要调用它们的Move方法就可以了。接口值可能赋值为任意类型的值,那我们如何从接口值获取其存储的具体数据呢?原创 2023-03-09 20:20:48 · 575 阅读 · 0 评论 -
Go语言结构体,这一篇就够了
使用type和struct关键字来定义结构体。原创 2023-03-07 17:22:01 · 798 阅读 · 0 评论 -
Go语言函数高级篇
函数当然还可以作为返回值,但是在Go语言中函数内部不能再像之前那样定义函数了,只能定义匿名函数。在Go语言的函数中return语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。语句执行的时机就在返回值赋值操作后,RET指令执行前。高阶函数分为函数作为参数和函数作为返回值两部分。语句会将其后面跟随的语句进行延迟处理。归属的函数即将返回时,将延迟处理的语句按。定义的逆序进行执行,也就是说,先被。将程序恢复回来,继续往后执行。的语句最后被执行,最后被。可以在任何地方引发,但。的语句,最先被执行。原创 2023-03-05 17:02:06 · 713 阅读 · 0 评论 -
如何使用go module导入本地包
因为这两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod文件中使用。在一个项目(project)下我们是可以定义多个包(package)的。中按如下方式指定使用相对路径来寻找mypackage这个包。原创 2023-03-05 15:58:10 · 746 阅读 · 0 评论 -
快速入门GORM,使用GORM进行CURD
约定:GORM 倾向于约定,而不是配置。默认情况下,GORM 使用ID作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用CreatedAtUpdatedAt字段追踪创建、更新时间为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了四个字段的Golang结构体// gorm.Model 定义 type Model struct {原创 2022-05-29 17:02:56 · 961 阅读 · 0 评论 -
【GORM】使用GORM连接各种数据库(2022)
gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。原创 2022-05-29 11:02:32 · 5299 阅读 · 0 评论 -
史上最详细的Gin中间件使用教程
Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。Gin中的中间件必须是一个类型// StatCost 是一个统计耗时请求耗时的中间件 func StatCost() gin . HandlerFunc {原创 2022-05-28 21:45:51 · 2231 阅读 · 0 评论 -
【Gin】文件上传,请求重定向,路由和路由组
为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,下面的代码为没有匹配到路由的请求都返回。我们可以将拥有共同URL前缀的路由划分为一个路由组。HTTP 重定向很容易。内部、外部重定向均支持。包裹同组的路由,这只是为了看着清晰,你用不用。此外,还有一个可以匹配所有请求方法的。包裹功能上没什么区别。原创 2022-05-26 17:18:31 · 364 阅读 · 0 评论 -
【Gin】Gin JSON渲染,获取参数,参数绑定
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的。由于form表单没有msg字段,所以msg采用默认的值。识别请求数据类型并利用反射机制自动提取请求中。当前端请求的数据通过JSON提交时,例如向。类型的数据,并把值绑定到指定的结构体对象。强大的功能,它能够基于请求自动提取。原创 2022-05-25 11:50:17 · 961 阅读 · 0 评论 -
【Gin】Gin模板渲染
定义一个不转义相应内容的safe// gin框架给模板添加自定义函数 r . SetFuncMap(template . FuncMap {return template . HTML(str) } , }) // 模板解析,解析templates目录下的所有模板文件原创 2022-05-23 17:16:45 · 1031 阅读 · 0 评论 -
【Gin】模板的高级用法
Go的模板支持自定义函数// 自定义一个函数kua,第二个返回值必须是error类型 kua := func(name string)(string , error) {" , nil } // 解析模板 // 当前路径下的tmpl // 创建一个模板对象 t := template . New("tem.tmpl") // 告诉模板引擎,现在多了一个自定义函数原创 2022-05-16 17:00:28 · 1657 阅读 · 0 评论 -
【Gin】初识Gin框架,模板基本语法
Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。如果你需要极好的性能,使用 Gin 吧。原创 2022-05-16 07:04:53 · 2840 阅读 · 0 评论 -
字节跳动青训营Day04 - Go编译器优化
将被调用函数的函数体的副本替换到调用位置上,同时重写代码以反映参数的绑定。原创 2022-05-14 21:28:18 · 578 阅读 · 0 评论 -
【字节跳动青训营 】高性能 Go 语言发行版优化与落地实践
为此,balanced GC 会根据 GC 策略,将 GAB 中存活的对象移动到另外的 GAB 中,从而压缩并清理 GAB 的内存空间,原先的 GAB 空间由于不再有存活对象,可以全部释放,如下图所示。Balanced GC 会将 GAB 中存活的对象移动到下面的 GAB 中,这样原先的两个 GABs 就可以被释放,压缩并清理 GAB 的内存空间。进行对象分配的方式相比,balanced GC 缩短了对象分配的路径,减少了对象分配执行的指令数目,降低 CPU 使用。对象存活的条件:当且仅当引用数大于 0。原创 2022-05-14 21:11:20 · 903 阅读 · 0 评论 -
字节跳动青训营Day03 - Go语言性能优化建议
避免常见的性能陷阱可以保证大部分程序的性能针对普通应用代码,不要一味地追求程序的性能,应当在满足正确可靠、简洁清晰等质量要求的前提下提高程序性能。原创 2022-05-14 17:54:38 · 530 阅读 · 0 评论 -
字节跳动青训营Day02 - 并发编程,单元测试
带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了。用于指定通道的方向,发送或接收。Go 允许使用 go 语句开启一个新的运行期线程, 即。之间通过传递一个指定类型的值来同步运行和通讯。的调度是由 Golang 运行时进行管理的。)是用来传递数据的一个数据结构。原创 2022-05-11 21:59:37 · 895 阅读 · 0 评论 -
字节跳动青训营Day01 - 实战项目 - 在线翻译字典
现在运行此程序,将是一个大的结构体结果,但显然我们只需要我们需要展示给用户的内容。这里推荐一个json转go struct的网站。原创 2022-05-11 09:49:43 · 549 阅读 · 0 评论 -
字节跳动青训营Day01 - Go语言基础项目实战 - 猜数字
【代码】字节跳动青训营Day01 - Go语言基础项目实战 - 猜数字。原创 2022-05-08 12:02:45 · 921 阅读 · 0 评论 -
Go语言复合数据类型
指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一定就是数组的第一个元素。当调用一个函数的时候,函数的每个调用参数将会被赋值给函数内部的参数变量,所以函数参数变量接收的是一个复制的副本,并不是原始调用的变量。因为函数参数传递的机制导致传递大的数组类型将是低效的,并且对数组参数的任何的修改都是发生在复制的数组上,并不能直接修改调用时原始的数组变量。Go语言中并没有提供一个set类型,但是map中的key也是不相同的,可以用map实现类似set的功能。原创 2022-04-23 11:51:37 · 572 阅读 · 0 评论 -
Go语言条件,循环,函数
变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。可变参数是指函数的参数数量不固定。这种格式的循环可以对字符串、数组、切片等进行迭代输出元素。循环是一个循环控制结构,可以执行指定次数的循环。必须是一个通道操作,要么是发送要么是接收。一个默认的子句应该总是可运行的。本质上,函数的可变参数是通过切片来实现的。变量中实际存储的变量类型。原创 2022-04-23 11:03:00 · 203 阅读 · 0 评论 -
Go语言变量初探
如果一个名字是大写字母开头的,那么它将是导出的,也就是说可以被外部的包访问,例如fmt包的Printf函数就是导出的,可以在fmt包外部访问。而相比之下,局部变量的生命周期则是动态的:每次从创建一个新变量的声明语句开始,直到该变量不再被引用为止,然后变量的存储空间可能被回收。基本的实现思路是,从每个包级的变量和每个当前运行函数的每一个局部变量开始,通过指针或引用的访问路径遍历,是否可以找到该变量。将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为。原创 2022-04-20 16:43:20 · 202 阅读 · 0 评论 -
Go语言简介,环境安装,Goland配置
现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。命令,就会从网上获取代码,并放到对应目录中(需要先安装 Git 或 Hg 之类的版本管理工具,并将对应的命令添加到 PATH 环境变量中。Go 语言提供的工具都通过一个单独的命令 go 调用,go 命令有一系列子命令。Go 语言的代码通过包(package)组织,包类似于其它语言里的库(libraries)或者模块(modules)。main 包比较特殊。,表示该文件属于哪个包,紧跟着一系列导入(import)的包,之后是存储在这个文件里的程序语句。原创 2022-04-20 15:52:49 · 556 阅读 · 0 评论