- 博客(238)
- 资源 (34)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 gin框架中form, uri 2种类型的数据绑定到自定义结构体, 绑定数据默认值设置方法, 时间格式绑定和格式设置 详解
要将请求form中的数据【包含,get, post,请求头HEADER中的数据等】绑定到自定义的结构体中, form类型的数据绑定使用tag form来进行标记绑定关系。结构体定义Page int `json:"page" form:"page,default=1"` // 这里将表单中的form 和这里的Page字段进行绑定,如果表单中没有page字段则设置默认值为1。
2024-07-01 15:24:15
877
原创 GORM 软删除 使用详解
在gorm这个ORM框架中,默认情况下,只要我们的表中包含了字段 deleted_at , 模型中包含的字段类型为那么这个情况下我们的模型就拥有了软删除功能。当调用Delete时,GORM并不会从数据库中删除该记录,而是将该记录的DeleteAt设置为当前时间,而后的一般查询方法将无法查找到此条记录。如果你并不想嵌套gorm.Model,你也可以像下方例子那样开启软删除特性:Deleted。
2024-07-25 21:55:24
184
原创 golang语言 .go文件版本条件编译,xxx.go文件指定go的编译版本必须大于等于xxx才生效的方法, 同一个项目多个go版本文件共存方法
在go语言中,我们不关是可以在编译时指定版本, 在我们的xxx.go文件中也可以指定go的运行版本,即 忽略go.mod中的版本,而是当当前的go运行版本达到指定条件后才生效的xxx.go文件。方法如下: 我们通过在xxx.go文件的头部增加以下代码即可。
2024-07-23 19:33:45
657
原创 一文帮你搞懂golang中的类型判断 x.(type) + switch case 和 反射中的switch 加 rv.Kind类型case reflect.Xxx的用法和区别
在golang中,我们可以通过(type)加的形式来对一个any类型的变量进行类型的判断和处理。这里的 x代表的是你要进行类型判断的any类型的变量,(type)和这个语法模式长得相似的有, 不过他们的用法和结果可完全不一样哦,大家要分清楚了。废话不多说,直接上示例。
2024-07-23 10:09:12
205
原创 golang中如何判断某个interface{}对象是否拥有指定的方法, 判断某个any对象是否实现了指定的接口interface 的方法
判断any对象是否拥有指定的方法在go语言里面,判断某个any对象是否拥有指定的方法 可以有2种途径:一是通过反射方式直接判断是否拥有指定的方法; 另外一种途径就是自己定义一个接口,然后将要判断的方法放到自定义的接口中,然后使用断言判断对象是否实现了指定的接口,这个有点绕,不过效率要搞一些!
2024-07-23 09:40:19
496
原创 js axios 网络请求参数中的 params 和 data 的区别 图示
前端开发中,我们常用的是axios这个网络请求库来发送我们的网络请求, 在axios中,params和data是有区别的,他们分别应对的是不同的使用场景。axios会将所有的请求数据附加到请求的url地址中,有请求数据长度的限制。一般用于GET请求。应用场景: 且请求参数不多,数据流很小的情况下,一般情况和GET配合使用。同时由于请求参数都暴露在了url里面,所以有安全风险,仅适用于非敏感数据的发送。如: 我们在params参数中发送一个ids数组类型的请求参数,则最后会生成类似这样的URL请求地址: /a
2024-07-22 17:04:22
467
原创 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
584
原创 gorm ORM框架Delete方法使用注意事项 删除回写,软删除,自定义条件删除,删除钩子函数等使用
gorm框架中的Delete方法用于删除数据,他的作用是 删除与给定条件匹配的value。如果value包含主键,则将其包含在删除条件中。如果value包含deleted_at字段,则Delete会执行软删除,如果deleted_at的值为空,则gorm通过将置为当前时间来实现。注意事项1. Delete方法中第一个参数value他是一个要删除的对象,这个对象需要使用指针类型,gorm会将删除的数据赋值到这个对象上;2. 如果这个对象包含主键,他会自动将主键当做删除条件;3. 如果这个对象包含d
2024-07-21 22:46:52
306
原创 vue项目源码调试方法 ,chrome调试控制台工作区使用,利用chrome控制台调试vue项目源码的方法 图解
我们在开发vue项目的时候,项目开始后的第一件事情应该就是准备调试工作了,Chrome调试控制台就给我们提供了这样的一个方便的调试工作区。在这个时候我们再次却换到网页标签,就可以看到有2个vue文件,右下角带绿色标识的就是我们添加的项目中的真正的源码文件,而另外一个则是经过webpack处理后的源码文件。在我们点击允许后,chrome就会自动帮我们却换到工作区标签,同时会以高亮的形式显示我们当前浏览的页面和我们的项目源码的对应关系,如下图。选择之后会有一个提示,点击允许。
2024-07-19 10:33:49
448
原创 node模块导入异常 SyntaxError: The requested module ‘/xxx.js‘ does not provide an export named ‘xxx‘ 解决方方法
node模块化开发里面导出的 export function xxx和 exportdefaultXXX 他们在导入的时候需要使用不同的导入方法,对于 export defaultXXX由于这里的XXX 对象他实际上就类似是一个匿名的对象,所以在你使用import导入的时候名称是可以由你自己随意的命名,故他不能使用命名方式导入, 而是应该将他单独作为一行来导入 ,即 import abcfrom '模块名' 这里的abc。
2024-07-19 09:44:38
493
原创 gin框架 POST 请求参数绑定 JSON数据ShouldBind 使用注意事项 - 结构体必须定义json标签
gin框架中的请求数据绑定ShouldBind可将前端发送的数据直接绑定到自定义结构体, 但是在POST发送JSON 数据时 需要注意 因为gin框架在底层绑定数据时使用了json对参数进行了反序列化, 所以我们在自定义的结构体中,如果前端发送的JSON中的字段和自定义结构体的字段的命名方式不一致时必须要增加json标签。 否则无法获取数据
2024-07-18 21:15:24
493
原创 vscode 批量将小驼峰(small camel)命名 更改为 蛇式命名snake 正则批量命名修改 最佳实践
在我们平时的开发中,一般来说数据库中的字段命名都是蛇式命名,而我们的对象中的属性命名一般都是大驼峰命名, 利用强大的正则我们可以轻松的批量调整我们的字段的命名方式。其他命名方式的批量替换和上面的套路都一样, 该一下正则表达式即可, 如果要反过来也是一样的,修改正则表达式和替换表达式, 调整方法参见。这个是把所有的small camel小驼峰的命名都修改为snake命名, 实际操作中最好带上上下文,这样可确保更细粒度的匹配和替换。首先我们需要找出我们需要调整命名方式的字符的共性模式,即写出匹配正则。
2024-07-18 20:46:19
359
原创 gin框架 任意类型 any /interface{}请求参数接收和解析笔记
/ 定义一个结构体,用来接收任意类型的id数据Ids any `form:"ids"` // 这里的tag form:"ids" 是gin框架中用来接收表单名为ids的数据的接收任意类型的参数的核心就是数据类型的转换,这里应用了go语言里面数据类型转换的3大法宝,反射,类型断言和类型获取。
2024-07-18 13:44:16
408
原创 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
1205
原创 gorm Raw 和 Table/Model构建的*gorm.DB对象的区别
当我们需要执行多个链式查询条件的时候,我们可以先通过 Table/Model来构建 *gorm.DB对象,然后在链式附加其他查询条件;如果我们不需要其他查询条件,就可以使用Raw原生查询方法来执行。注意在使用Raw原生查询方法是,如果是直接拼接SQL,需要注意使用Quote转码特殊字符, 可以使用*gorm.DB查询条件里面的Statement.Quote()方法来对查询参数进行转码,即 tx.Statement.Quote(xxx)
2024-07-17 16:16:15
390
原创 sql查询语句 Error 1052 (23000): Column ‘xxx‘ in where clause is ambiguous 异常 解决方法
出现这个异常一般是在多表联合查询的时候 多个表中有相同的字段,而我们没有对相关的字段设置别名所致。ambiguous 就是模棱两可的意思。这类型的错误实际上SQL的提示一般都已经所得很清楚了,我们需要的就是加强对语文的认识,哈哈。解决方法: 将相关的查询字段加上表别名即可。
2024-07-16 19:27:49
139
原创 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
1026
原创 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
346
原创 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
1183
原创 gorm多表联合查询 Joins方法 LEFT JOIN , RIGHT JOIN , INNER JOIN, FULL JOIN 使用总结
当然我们这里要说的使用方式是官方示例里面没有的,有的我们就不重复废话了。从上面的方法定义我们可以看到,这个Joins的第一个参数query string 他就是一个查询字符串, 第二个参数是可变参数, 从这个参数定义就可以看出,这里的第一个参数query 就是我们需要进行多表链接的查询参数,这里的查询参数可以是任何的SQL支持的链接查询语句,如LEFT JOIN, RIGHT JOIN , INNER JOIN, FULL JOIN等。
2024-07-15 22:37:47
477
原创 gorm数据库define a valid foreign key for relations or implement the Valuer/Scanner interface异常解决方法
gorm ORM框架在对我们自定义的结构体进行Sacn数据扫描的时候异常 [error] invalid field found for struct XXX's field Children: define a valid foreign key for relations or implement the Valuer/Scanner interface。
2024-07-15 15:38:36
438
原创 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
226
原创 gorm中使用事务的2种方法 Transaction和Begin的使用详解
在gorm这个orm框架中,我们可以通过 .Transaction方法开启一个自动事务,可以通过.Begin方法开启一个手动事务。所谓的自动事务就是在整个事务的执行过程中如果用到错误他会自动帮你回滚数据, 而手动事务就需要你自己手动回滚数据。
2024-07-13 20:02:15
488
原创 gorm获取最后插入的数据ID的方法 LastInsertId
这里的 entity.SysUser 就是你的数据库表的实体对象定义, 在使用Create方法或者Save方法插入数据后gorm会将当前插入的数据对应的数据库中的记录都通过反射写入到user这个对象上面,我们要获取最后插入的ID或者当前插入数据的其他信息都可以通过这个对象获取, 这个还是很方便的,比使用LastInsertId 更加精简!
2024-07-13 19:14:33
145
原创 gorm只查询某一些字段字段的方法Select, 和只查询某一字段方法 Pluck
gorm中默认是查询所有字段的, 如果我们只需要获取某些字段的值,可以通过使用 Select方法来指定要查询的字段来实现, 也可以通过定义一个需要字段的结构体来实现;而如果我们只需要查询某一个字段的值就可以使用 Pluck方法来获取(这里的pluck就是采摘的意思,表示只摘取某一个字段的值)
2024-07-13 18:58:57
473
原创 正则 批量 命名转换 -- 大驼峰、小驼峰、蛇形和串式之间相互转换替换,字母字符串大小写批量查找 转换 替换
正则表达式的模式转换符号给我们批量查找和转换大小写提供了非常方便的方式, 我们只需要将查找的字符根据我们需要转换的最终字符进行拆分后,在利用替换中的模式转换符号灵活应用,即可实现批量对字符串的大小写进行查找和转换。这里的模式转换符号是应用在替换表达式里面的,\l \u是转换捕获到的第一个字符, 而 \L \U 则是转换捕获到的整个字符串。当然上面的二正则替换模式转换符在 我们的主流编辑器,如vscode, idea, sublime等里面都是可用的。
2024-07-04 09:52:06
479
原创 gin框架 gin.Context中的Abort方法使用注意事项 - gin框架中立刻中断当前请求的方法
gin框架上下文中的Abort序列方法(Abort,AbortWithStatus,AbortWithStatusJSON,AbortWithError)他们都不会立刻终止当前的请求,在中间件中调用Abort方法后中间件中的后续的代码会被继续执行,但是中间件后面的handler控制器方法会被终止执行(在中间件中调用Abort以确保不会调用此请求的其余处理程序)
2024-07-02 19:43:33
748
原创 golang html/template: no such template “xxx.html“ , html/template: “xxx.html“ is undefined 异常解决方法
这个异常就是提示你对应的模板没有定义, 在模板文件中使用 {{define "xxx.html"}} 模板内容 {{end }} 进行定义即可。这个提示没有指定的模板文件,一般情况下是在使用之前没有对对应的模板文件进行解析,参考 解决。
2024-07-02 13:21:54
343
原创 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
403
原创 golang中的类型转换那些事
golang中类型转换的途径大致有4种,强制转换,类型断言,类型匹配 还有使用strconv包中提供的转换函数。go语言中的类型转换和我们常用的java, rust, c, php等语言的类型转换可谓是完全不一样,他使用了自己独有的语法模式。对于新手而言前面3种模式很容易搞混淆,需要特别注意。 另外在进行类型断言时 对于断言后的结果他是可以有2个接收参数,也可以只有一个接收参数!搞清楚他们的区别很重要,这点需要特别注意。
2024-07-02 12:51:42
1361
原创 golang 未指定类型interface{} 类型的 int类型数据json.Unmarshal 解码后变成float64类型问题解决方法
解决方法很简单,就是使用自定义的解码器,然后调用解码器中的 UseNumber()方法即可。我们在使用.UseNumber() 方法后可根据我们的需要对这个类型进行一个转换处理,如果不处理直接输出的话就是字符串, 如果想要变成int64输出,则需要调用哦 Int64方法进行转换。注意在使用了.UseNumber() 方法后,数据中所有的interface{}类型的 int 类型数据都会被转换为 json.Number类型输出。这个json.Number是json里面定义的一个类型,他有3个方法,即。
2024-07-01 18:32:12
316
原创 go 如何 循环和修改指针类型的map数据 - cannot range over m (variable of type *map[string]interface{}) 解决方法
在go语言中map数据属于引用类型, 对于指针类型的map数据的循环 如果我们直接使用变量名来进行range循环的话,就会提示 cannot range over m (variable of type *map[string]interface{})异常的代码如下,当我们对一个类型为map指针的变量m进行循环时 就会抛 cannot range over m (variable of type *map[string]interface{}) 异常。即要使用*将指针指向具体的值之后才能进行循环。
2024-07-01 17:43:52
210
原创 全网最详细的 gin框架请求数据绑定Bind 源码解析 -- 帮助你全面了解gin框架的请求数据绑定原理和方法
在gin框架中,我们可以将多种请求数据(json, form,uri,header等)直接绑定到我们定义的结构体,底层是通过反射方式获取我们定义在结构体上面的tag来实现请求数据到我们的结构体数据的绑定的。 在gin的底层有2大体系的数据绑定一个是Bind,是个是ShouldBind, 下面我们就从数据绑定入口开始一层层的解开gin数据绑定的神秘面纱!
2024-07-01 12:08:00
1042
原创 golang template模板嵌套语法 为何不能使用变量 底层源码解析
在go的模板里面,实际上他所有的关键字最终编译器层面基本上都是以函数的方式运行的。这里的template关键字 的第二个参数在递交编译器之前被 Quote 了一把, 所以这里任何的变量都不会被解析,从而导致了template模板嵌套语法 不能使用任何的变量!
2024-06-29 11:24:04
477
原创 golang template HTML动态模板解析实现
动态模板解析这里的关键点就是如何将指定的模板文件解析为HTML字符串,一般我们常见的就是直接将模板文件解析后输出到浏览器, 而这里是将模板文件解析后返回HTML格式的字符串,这就需要我们使用自定义的writer来接收模板解析后的内容,然后将这些内容返回, 注意这里在返回的时候必须使用 template.HTML 类型, 否则你返回的字符串将是被转码后的html,是不会被浏览器渲染的。
2024-06-29 10:47:50
320
原创 golang 如何判断当前是否是运行单元测试?
我们在go的模块化开发的时候,运行模块里面的单元测试时,当前整个模块的 init 函数都会被执行,在某些情况下我们运行独立的单元测试并不需要执行其他文件里面的init函数,这时就需要判断当前是否是在运行单元测试,判断方式很简单,只需要判断当前运行参数是否是以-test开始即可,if len(os.Args) > 1 && strings.HasPrefix(os.Args[1], "-test") { }。
2024-06-29 09:06:41
332
原创 gin框架 HTML 模板加载,渲染 使用详解和总结
本文从gin框架中html模板的加载,渲染和使用,功能定义等方面详细讲解了gin框架中的html模板渲染工程和使用注意事项等。
2024-06-28 17:55:50
1264
1
原创 golang中空值判断函数,支持任意类型的空值判断
使用反射方式对any任意类型的数据是否为空判断, 可判断时间对象是否为空, 可判断所有数字类型,指针类型和结构体字符串是否为空。
2024-06-28 12:18:33
313
原创 golang 通过reflect反射方式调用对象方法 (动态方法调用) 详解
反射中的2种途径都可以调用对象的方法, 一种是通过先获取方法的数量,然后循环调用全部方法, 另外一种是通过具体的方法名称直接获取 reflect.Value 后调用对象方法。这个过程中需要注意的是,如果对象为指针类型,则需要先调用 .Elem() 方法获取指针指向的具体值后再操作。而对于有参数的方法调用相对复杂,这个一般不常用,知道大概流程即可。
2024-06-28 12:14:13
601
原创 golang中 time.Time的零值, 如何判断time.Time是否为空
go语言中的Time对象默认是 普通结构体对象,而非指针类型的对象, 我们如果按照常见的方式按照指针类型判断是否为空的话就会报编译异常 invalid operation: rxxTime!类型 interfaces 接口, slices 切片, channels 管道, maps 映射, pointers 指针, 和 functions 函数 的零值都是 nil。这下我们不用谢上面那么长的一串字符了,用这个简单的方法即可判断time.Time对象是否为空。布尔类型 false。
2024-06-28 00:24:27
341
k2p MT7621A适用的智能路由器OpenWrt 23.05.2最新版刷机固件
2024-01-09
macos中使用的Burpsuite Pro 2023.12.1 中提取的JAVA运行时 jre 20.0.2
2023-12-22
Icu4c 73 brew自定义版本安装源
2023-09-11
Axure RP元件库大全-上千个axure元件库-史上最全.7z
2019-06-25
RedisDesktopManager Win 0.9.8.1156 redis的可视化管理工具
2018-11-06
myeclipse2017 和谐补丁 + 闪退补丁 mac win系统通用
2017-12-26
CI辅助函数 PHP自动获取用户地理位置信息的函数 支持淘宝, 新浪等多个IP数据库
2016-09-25
CodeIgniter 3中文手册 --CI 3.0 官方简体中文版用户手册.chm
2016-09-25
ThinkPHP5.0 php7 Auth权限认证管理模块
2016-04-06
eAccelerator for windows php 5.3.XX VC9 PHP加速模块下载
2015-07-10
ModSecurity Handbook使用手册
2015-07-10
codecanyon_super-ajax-contact-form PHP超级邮件联系表单
2015-04-19
安卓ROM system.img 解包与打包工具unyaffs mkyaffs2image
2014-12-02
Magic Zoom Plus v4.5.28 图片放大镜去水印破解 学习版
2014-05-07
1200元的SEO电子书教程内容.doc
2014-05-05
大型网站架构演变和知识体系.pdf
2011-11-28
基于电子病历的医疗质量控制.pdf
2011-11-28
百度影音服务端 视频服务器V1.0.2.23 最新版
2011-10-23
alibaba.com new PHP clone 英文版阿里巴巴克隆 PHP完整版源码
2010-03-23
CuteFTP 8.3 Professional简体中文纯录色注册版
2008-10-12
ASP PHP在线解压工具
2008-02-19
IIS6+JSP配置工具
2007-12-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人