
golang
文章平均质量分 54
tekin
激情,创新,进取!
展开
-
golang interface{} Type assertions类型断言 x.(T) 和Type switches类型选择 switch x.(type) 的区别 与官方详解
他们的详细用法和使用示例见golang白皮书详解, 为了保留原汁原味,直接贴官方英文了,单词也简单,应该都能看明白!原创 2024-08-25 20:26:05 · 967 阅读 · 0 评论 -
golang RSA 解密前端jsencrypt发送的数据时异常 crypto/rsa: decryption error 解决方法
golang中 RSA解密前端(jsencrypt)发来的密文后出现 "crypto/rsa: decryption error" , 这个问题首先需要确认你的私匙和公匙是否匹配, 如果匹配 那检查入参数据类型, 前端发送来的rsa加密后的数据一般都是经过base64编码后的, 在后端进行RSA解码时需要对前端发送的数据进行base64解码!原创 2024-08-24 17:56:20 · 909 阅读 · 0 评论 -
golang reflect反射方式修改对象的值 reflect.Value对象中的SetX类型(xxx) 和 Set(x reflect.Value) 方法的区别和使用总结
了解下面的这些函数, 对象和方法的定义对应我们学习golang的放射至关重要!!func Copy(dst, src Value) int // 数据拷贝函数func DeepEqual(x, y any) bool // 深度相等比较函数func Swapper(slice any) func(i, j int) // 交换函数type Kind // 反射类别type MapIter // map类型数据迭代对象定义。原创 2024-08-18 19:08:43 · 974 阅读 · 0 评论 -
golang 如何利用defer+recover()函数 将指定类型的panic异常转换为函数返回 error返回 使用方法示例
在golang开发的时候,对于业务逻辑中的某些panic异常,我们希望将某些不可控的panic异常转换为普通的 error并作为函数返回值返回, 如io 或者os中的某些操作就会导致panic异常,对于这个过程中的某些不可控的panic异常我们希望将某些类型的异常转换为 普通的error变量在函数里面返回。原创 2024-08-18 11:17:09 · 327 阅读 · 0 评论 -
zap日志库 自定义CallerEncoder 方法, 同时适用于其他几个Encoder如 LevelEncoder,TimeEncoder,NameEncoder,DurationEncoder等
从上面的配置中我们可以得知, 这个EncodeCaller他实际上是一个函数定义 type CallerEncoder func(EntryCaller, PrimitiveArrayEncoder) 如下图所示:我们要自定义这个EncodeCaller实际上就是定义这样一个函数即可。定义方式如下:即在我们初始化配置对象的时候对这个EncodeCaller定义一个函数即可,这样每次在zap执行的时候就会调用我们定义的这个函数。即,如下示例。原创 2024-08-17 15:07:54 · 530 阅读 · 0 评论 -
golang 字符串strings Title, Upper, Lower, Fold的代替处理库golang.org/x/text/cases使用方法总结, Caser对象使用
golang官方提供的这个扩展包text/cases 主要通过 Caser这个对象来处理字符串的大小写,他的定义如下:typeCasertypeOption可见这个结构体的属性t 是一个接口SpanningTransformer, 而这个接口又继承了Transformer接口Reset()原创 2024-08-17 12:29:41 · 1028 阅读 · 0 评论 -
golang字符串首字母大写转换函数strings.Title已弃用解决方法 strings.Title is deprecated, golang.org/x/text/cases 代替用法示例
golang 中在使用strings.Title将首字母转为大写时会提示这个函数已经弃用,原因是这个函数无法正确处理Unicode字符,如中文。建议我们使用 golang.org/x/text/cases 来代替,原创 2024-08-17 11:40:48 · 241 阅读 · 0 评论 -
golang zap日志库 打印日志时显示的源文件始终是同一个问题解决方法 zap.Option函数可选项 zap.AddCallerSkip(1) 使用示例
golang 获取调用函数的源文件路径和所在行号, 获取异常发生的源文件路径和行号方法 -- runtime.Caller, Callers, CallersFrames获取调用堆栈函数使用与总结-CSDN博客。原创 2024-08-17 00:16:42 · 377 阅读 · 0 评论 -
viper配置文件读取管理库 一个支持12种文件类型,5种远程协议的配置文件管理和加载工具库 使用方法示例
viper是一个不错的配置文件管理库, 他支持12种文件类型,5种远程协议的配置文件管理和加载工具库 使用方法示例原创 2024-08-16 23:35:32 · 666 阅读 · 0 评论 -
zap logger 日志记录库 options接口类型 可选参数(函数)使用 总结
zap是go语言中的一个不错的日志记录库, 在我们创建zap.Logger对象的时候,第一个参数就是一个Core, 这个即是这个zap框架的内核,第二个参数options是一个可选参数,他的类型是一个名为Option的接口定义, 这个接口里面就一个方法 apply(*Logger) 参数就是我们要创建的这个Logger指针对象。 如下所示:从上面可见,我们在创建Logger对象的时候对于这个Logger对象,我们只提供了4个属性, 而实际上这个Logger对象里面的属性可不止4个, 那如果我们要对这些属性进原创 2024-08-15 13:38:16 · 552 阅读 · 0 评论 -
golang 获取调用函数的源文件路径和所在行号, 获取异常发生的源文件路径和行号方法 -- runtime.Caller, Callers, CallersFrames获取调用堆栈函数使用与总结
在golang中,我们可以通过go官方提供的runtime包中的 Caller函数获取是那个文件在哪一行调用了当前函数, 使用Callers, CallersFrames函数,我们可以获取完整的函数调用堆栈信息, 包括 调用函数所在的源码文件, 行号, 函数等信息。 这些信息在我们排查异常和解决异常信息时非常有用,有了这个信息,我们就可以快速定位问题发生的源文件和行号。 Caller函数定义 func runtime.Caller(skip int) (pc uintptr, file string, l原创 2024-08-15 12:10:18 · 1200 阅读 · 0 评论 -
golang gin框架中创建自定义中间件的2种方式总结 - func(*gin.Context)方式和闭包函数方式定义gin中间件
gin框架自定义中间件常用的方式,1.定义一个参数为*gin.Context的函数或者方法。定义的方法就是创建一个 参数类型为 gin.HandlerFunc 【 他的原型定义为 type HandlerFunc func(*Context) 】的中间件,如: func XxxFoo(c *gin.Context) {}注意: 虽然这种方式定义的中间件和入参和路由处理函数的定义是一样的, 但是他们的用途和业务处理方式是有区别的, 在中间件中我们可以通过 c.Next() 方法继续后面的请求, 2....原创 2024-08-14 11:25:49 · 1389 阅读 · 1 评论 -
golang 条件语句中有多条件时多条件的执行顺序和执行效率问题总结 -- if else条件语句 多条件时执行顺序为从左到右
在golang的 条件语句中有多个执行条件时,go的执行顺序为从左到右依次执行, 如果多个条件是 && 条件与的关系,则执行条件的顺序就与程序的效率密切相关,原创 2024-08-09 19:58:36 · 366 阅读 · 0 评论 -
golang for range time.Ticker 和 time.Timer时间通道使用示例 - 每隔指定时间执行一次,执行指定时长后退出执行
golang中的 ticker和timer时间通道除了可以使用for select case语句来执行外, 还可以使用 for range语句来执行ticker或者timer时间通道。原创 2024-08-09 16:17:44 · 466 阅读 · 0 评论 -
golang for select { case } 语句 time.Ticker每隔指定时间间隔就执行一次;time.Timer在指定的时间之后执行一次,Ticker和Timer的区别和用法总结
golang中我们如果要创建一个每隔一段时间就执行一次的逻辑就使用 time.NewTicker 创建时间断续器, 如果我们希望在指定时间之后只执行一次就使用 time.NewTimer 创建一个定时器。 select语句的作用是在多个通道中选择一个可用的通道执行,他最少需要有2个以上的通道, 且每隔case语句后面必须跟的是io操作, 同时select语句会阻塞当前进程直到其中的一个通道可用。原创 2024-08-08 17:25:58 · 388 阅读 · 0 评论 -
用于gin框架的CORS中间件,解决身份凭证和通配符不能同时设置问题,可同时配置附带身份凭证的请求和*通配符,chrome插件CORS跨域请求通配符
用于gin框架的CORS中间件(当然,用在其他的框架和语言中相应的Header头设置和配置信息和应用原理都是一样的),解决Access-Control-Allow-Credentialstrue身份凭证和 Access-Control-Allow-Origin: | * 通配符不能同时设置问题,可同时配置附带身份凭证的请求和*通配符,以及在chrome插件中访问远程CORS跨域请求通配符问题等原创 2024-08-07 12:17:28 · 643 阅读 · 0 评论 -
golang中的星号*通配符字符串模式匹配 和问号? 通配符字符串模式匹配的2种实现方法 和相关的单元测试用例
在go语言中,我们如果需要对字符串进行星号* 或者问号? 模式匹配, 可以有2种方法实现通配符 * 问号 ? 匹配, 找出给定的输入字符串str是否与pattern字符串模式相匹配。原创 2024-08-07 11:44:33 · 1048 阅读 · 0 评论 -
golang判断某个文件内容是否是二进制文件方法, LimitReader, 获取文件大小,字符串0写入后的byte数据为48, byte零值
go语言中判断某个文件是否是二进制文件的方法, 通过LimitReader读取指定大小的数据后对数据进行判断, 这里有一个很有趣的知识点就是十六进制 0x30。原创 2024-08-06 13:32:41 · 349 阅读 · 0 评论 -
golang下载、上传文件MD5高效计算方法,利用io.TeeReader函数特性 实时计算文件md5签名
在go语言的开发中,当我们在操作下载或者上传文件对象时, 我们可以利用golang内置的io包中的 TeeReader函数特性,高效实时计算文件的md5值。 方法如下......原创 2024-08-06 10:31:49 · 590 阅读 · 0 评论 -
golang命名异常 error var Xxx should have name of the form ErrFoo (ST1012) 解决方法
异常原因分析:这个提示通常发生在我们使用var 定义一个变量来接收 error异常信息时的变量名称不规范所致。其实这里的异常信息“error var Xxx should have name of the form ErrFoo (ST1012)” 这个提示里面也已经提醒了" 变量 Xxx 的名称格式应该为 ErrFoo ", 即提醒你变量Xxx的名称应该是 ErrXxx 。原创 2024-08-04 09:49:31 · 427 阅读 · 0 评论 -
golang转换时间对象,时间字符串,时间戳到自定的时间字符串方法, 支持时间对象、秒/毫秒时间戳,时间字符串转换为统一的时间字符串
转换时间对象,时间字符串,时间戳到自定的时间字符串方法, 支持时间对象、秒/毫秒时间戳,时间字符串转换为统一的时间字符串。原创 2024-08-03 21:24:43 · 385 阅读 · 0 评论 -
golang 转换时间戳到字符串函数 支持秒和毫秒时间戳 转换到自定字符串
ps: 如果希望返回的时间字符串为默认的格式 time.RFC3339 即 "2006-01-02T15:04:05Z07:00" , 则第二个参数直接传递空字符串即可,即: TsToStr(1722657237,"")使用 strutils.TsToStr(1722683285997,"") // 输出 "2024-08-03T19:08:05+08:00"原创 2024-08-03 20:12:27 · 457 阅读 · 0 评论 -
go pkg包名,如何在pkg.go.dev发布golang软件包, package包名, import包名, git库名, go.mod module模块名称 区别与使用总结
golang的包名在不同的地方作用不同,用途不同。 在我们通过pkg.go.dev发布自己的包的时候,了解这些包名和他们的用途就很有必要了。 下面我们以go语言中的pkg库 github.com/tekintian/strutils为例说明各种名称的区别和用途。要在pkg.go.dev发布自己的软件包,首先需要创建一个git仓库,然后通过 https://pkg.go.dev/{go软件包仓库地址} 访问后根据提示即可将你的软件包提交到golang的pkg公共仓库。 示例: 将git仓库https://gi原创 2024-08-03 15:51:27 · 1361 阅读 · 0 评论 -
gin框架中断当前网络请求代码执行的 2种方法总结 - panic, Abort() , return
在go语言的开发中,我们要中断当前代码执行 可以使用 return 语句来中断当前代码的执行。 return 语句中断的是当前函数的代码执行。 在gin框架中,如果要中断当前的网络请求,有2种方法。原创 2024-07-30 17:58:46 · 383 阅读 · 0 评论 -
golang语言 .go文件版本条件编译,xxx.go文件指定go的编译版本必须大于等于xxx才生效的方法, 同一个项目多个go版本文件共存方法
在go语言中,我们不关是可以在编译时指定版本, 在我们的xxx.go文件中也可以指定go的运行版本,即 忽略go.mod中的版本,而是当当前的go运行版本达到指定条件后才生效的xxx.go文件。方法如下: 我们通过在xxx.go文件的头部增加以下代码即可。原创 2024-07-23 19:33:45 · 971 阅读 · 0 评论 -
一文帮你搞懂golang中的类型判断 x.(type) + switch case 和 反射中的switch 加 rv.Kind类型case reflect.Xxx的用法和区别
在golang中,我们可以通过(type)加的形式来对一个any类型的变量进行类型的判断和处理。这里的 x代表的是你要进行类型判断的any类型的变量,(type)和这个语法模式长得相似的有, 不过他们的用法和结果可完全不一样哦,大家要分清楚了。废话不多说,直接上示例。原创 2024-07-23 10:09:12 · 490 阅读 · 0 评论 -
golang中如何判断某个interface{}对象是否拥有指定的方法, 判断某个any对象是否实现了指定的接口interface 的方法
判断any对象是否拥有指定的方法在go语言里面,判断某个any对象是否拥有指定的方法 可以有2种途径:一是通过反射方式直接判断是否拥有指定的方法; 另外一种途径就是自己定义一个接口,然后将要判断的方法放到自定义的接口中,然后使用断言判断对象是否实现了指定的接口,这个有点绕,不过效率要搞一些!原创 2024-07-23 09:40:19 · 647 阅读 · 0 评论 -
golang 字符编码 gbk/gb2312 utf8编码相互转换,判断字符是否gbk编码函数, 字符编码转换基础原理解析, golang默认编码utf8
虽然golang里面的默认编码都是统一的unicode utf8编码, 但是我们在调用外部系统提供的api时,就可能会遇到别人的接口提供的编码非 utf8编码,而是gbk/gb2312编码, 这时候我们就必须要将别人的gbk编码转换为go语言里面的默认编码utf8。GB2312编码的范围: 十进制 => 高位字节:161 - 247, 十六进制:0xA1 - 0xF7;低位字节:161 - 254 , 十六进制:0xA1 - 0xFE。原创 2024-07-22 12:30:30 · 1569 阅读 · 0 评论 -
gin框架 任意类型 any /interface{}请求参数接收和解析笔记
/ 定义一个结构体,用来接收任意类型的id数据Ids any `form:"ids"` // 这里的tag form:"ids" 是gin框架中用来接收表单名为ids的数据的接收任意类型的参数的核心就是数据类型的转换,这里应用了go语言里面数据类型转换的3大法宝,反射,类型断言和类型获取。原创 2024-07-18 13:44:16 · 564 阅读 · 0 评论 -
js vue axios post 数组请求参数获取转换, 后端go参数解析(gin框架)全流程示例
这里将请求参数id统一转换为数组, 因为这里的请求参数id, 有可能是一个原始值 , 也有肯能是一个数组。//url可用性检测// 这里的参数id有可能是一个数组,也有可能是一个值,// 这里在最终发送的时候都转换为数组来传递// 创建一个数组arr = id;// 如果入参是一个数组 Proxy(Array) 则将他赋值给 arr} else {// 将参数id放入到数组中data: {ids:arr});原创 2024-07-18 12:51:36 · 1474 阅读 · 0 评论 -
golang反射赋值类型异常 “error“: “reflect.Set: value of type *xxx is not assignable to type xxx 底层原因与解决方法
golang中的反射赋值,搞明白.Elem()方法是关键, 出这个问题的原因就是类型不匹配,而根源是.Elem()方法获取了指针指向的值,这时当前的对象的值的类型就发生了改变,所以我们在反射里面调用xx.Elem().Set(reflect.ValueOf(xxx)) 对对象进行赋值时就需要对对象的值做相应的调整。原创 2024-07-16 16:49:09 · 1221 阅读 · 0 评论 -
golang无限层级菜单,子菜单Children 数据递归处理和gorm数据获取示例
/ model.SysMenu 菜单表gorm实体模型定义 示例comment:父菜单ID" json:"pid"` // 父菜单IDnot null;comment:菜单名称" json:"name"` // 菜单名称// 这个是我们返回前端的带层级的菜单对象model.SysMenu // 继承model.SysMenu实体模型。原创 2024-07-16 10:16:48 · 608 阅读 · 0 评论 -
golang中通过反射给对象赋值 reflect.Value,reflect.Type, 自定义异常 最佳实践
go里面的自定义异常非常简单, 你直接自定义一个error的类型即可,见上面的示例。在go里面,error是一个内置的接口定义,他就定义了一个方法Error() string, 所以,在go语言里面,其实只要你的对象只要是实现了方法 Error() string 则你的这个对象就可以作为一个自定义的异常来使用。error接口定义参考reflect.Value实现了reflect.Type中定义的所有方法,是Type接口的具体实现。原创 2024-07-16 09:25:14 · 1498 阅读 · 0 评论 -
go redis 获取数据时Scan失败 提示redis: can‘t unmarshal %T (consider implementing BinaryUnmarshaler) 解决方法
如果存储的是自定义结构体, 在使用Scan获取数据的时候,则必须要实现 encoding.BinaryUnmarshaler 这个接口,否则Scan无法获取数据。实现解码接口很简单,实际上就是在你的对象上面增加一个UnmarshalBinary方法,当你在调用go-redis的scan的时候他就会自动调用你的自定义对象中的UnmarshalBinary方法,从而你就可以获取到你要的数据了。方法定义 : UnmarshalBinary(data []byte) error。原创 2024-07-14 12:48:50 · 406 阅读 · 0 评论 -
gorm中使用事务的2种方法 Transaction和Begin的使用详解
在gorm这个orm框架中,我们可以通过 .Transaction方法开启一个自动事务,可以通过.Begin方法开启一个手动事务。所谓的自动事务就是在整个事务的执行过程中如果用到错误他会自动帮你回滚数据, 而手动事务就需要你自己手动回滚数据。原创 2024-07-13 20:02:15 · 2153 阅读 · 2 评论 -
gorm获取最后插入的数据ID的方法 LastInsertId
这里的 entity.SysUser 就是你的数据库表的实体对象定义, 在使用Create方法或者Save方法插入数据后gorm会将当前插入的数据对应的数据库中的记录都通过反射写入到user这个对象上面,我们要获取最后插入的ID或者当前插入数据的其他信息都可以通过这个对象获取, 这个还是很方便的,比使用LastInsertId 更加精简!原创 2024-07-13 19:14:33 · 664 阅读 · 0 评论 -
gorm只查询某一些字段字段的方法Select, 和只查询某一字段方法 Pluck
gorm中默认是查询所有字段的, 如果我们只需要获取某些字段的值,可以通过使用 Select方法来指定要查询的字段来实现, 也可以通过定义一个需要字段的结构体来实现;而如果我们只需要查询某一个字段的值就可以使用 Pluck方法来获取(这里的pluck就是采摘的意思,表示只摘取某一个字段的值)原创 2024-07-13 18:58:57 · 2102 阅读 · 0 评论 -
gin框架 gin.Context中的Abort方法使用注意事项 - gin框架中立刻中断当前请求的方法
gin框架上下文中的Abort序列方法(Abort,AbortWithStatus,AbortWithStatusJSON,AbortWithError)他们都不会立刻终止当前的请求,在中间件中调用Abort方法后中间件中的后续的代码会被继续执行,但是中间件后面的handler控制器方法会被终止执行(在中间件中调用Abort以确保不会调用此请求的其余处理程序)原创 2024-07-02 19:43:33 · 1202 阅读 · 0 评论 -
golang html/template: no such template “xxx.html“ , html/template: “xxx.html“ is undefined 异常解决方法
这个异常就是提示你对应的模板没有定义, 在模板文件中使用 {{define "xxx.html"}} 模板内容 {{end }} 进行定义即可。这个提示没有指定的模板文件,一般情况下是在使用之前没有对对应的模板文件进行解析,参考 解决。原创 2024-07-02 13:21:54 · 456 阅读 · 0 评论 -
golang template模板 template: xxx.html is an incomplete or empty template 解决方法
当我们在使用go语言中的template渲染多个模板文件时,如果我们使用的模板文件没有使用 ParseFiles方法进行解析就直接在模板里面使用 template进行嵌套的话就会出现 template: xxx.html is an incomplete or empty template 的异常。ParseFiles解析命名文件,并将生成的模板与t相关联。如果发生错误,解析将停止,返回的模板为nil;解决方法: 在我们使用的时候先将可能用到的模板文件全部扫描后用ParseFiles进行解析以下即可。原创 2024-07-02 13:15:32 · 576 阅读 · 0 评论