
Go
文章平均质量分 90
Go语言从入门到熟练
码农兴哥
纸上得来终觉浅,绝知此事要躬行。
展开
-
go-zero自动生成repository文件和测试用例
在软件开发中,尤其是在采用分层架构或者领域驱动设计(DDD)的项目里,repository(仓库)是一个关键概念,它起到数据访问层和业务逻辑层之间的桥梁作用,负责处理数据的持久化与检索,让业务逻辑层无需直接与数据库或其他数据存储交互。简单来说,repository 是一种设计模式,它把数据访问逻辑封装起来,让业务逻辑层和数据访问层解耦,从而提高代码的可维护性和可测试性。UserRepo 就是一个实现了该模式的具体类,它提供了对 User 模型的各种数据操作方法。原创 2025-04-10 16:47:43 · 806 阅读 · 0 评论 -
go-zero使用elasticsearch踩坑记:时间存储和展示问题
通过go写入ES的示例,但是里面存在一个细节问题,就是写入的时间和ES展示的时间相差8小时的问题。导致这个问题的原因是时区设置的问题。由于写入到ES的时候没有特别设置具体的时区,ES会当成UTC时间处理,也就是认为写入的时间是UTC的2025-04-02 14:32:00,然而北京时间比UTC时间晚8个小时,那么,可以推测kibana页面上看到的应该是北京时间。原创 2025-04-03 17:20:12 · 1000 阅读 · 0 评论 -
Golang关于结构体组合赋值的问题
Golang关于结构体组合赋值的问题原创 2025-02-14 17:56:23 · 372 阅读 · 0 评论 -
go语言简单快速的按顺序遍历kv结构(map)
在go语言中,如果需要对map遍历,每次输出的顺序是不固定的,多运行几次就会发现,每次运行后的顺序并不一致,因为go中的map的遍历是不保证顺序的。那么,直接在遍历的时候对key进行排序再按照key的顺序输出可以保证输出的都是按照key由小到大排序的结果。但是会存在缺陷。因此可以考虑存储为二维切片或结构体。原创 2025-02-12 18:43:29 · 515 阅读 · 0 评论 -
go-zero框架快速入门
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成代码。原创 2025-01-06 15:31:07 · 1539 阅读 · 0 评论 -
go项目使用gentool生成model的gen.go问题
Gen Tool 是一个没有依赖关系的二进制文件,可以用来从数据库生成结构。出现这个情况,可能是这个工具的一个bug。如果改为生成全部表名,也不太方便,因为有时候其他小伙伴改动了某个表,不能随着当前版本上线,就会很被动。除非每次执行这个命令的时候,都要把之前已经有的数据表名都带上,会很麻烦。原创 2025-01-02 17:25:03 · 518 阅读 · 0 评论 -
Go语言Gin框架调用企业微信接口根据手机号获取userid
这篇文章主要是讲一下在Go语言Gin框架中对接企业微信获取数据的一个代码示例,主要涉及到Redis的基本用法、HTTP的GET和POST请求、对接企业微信接口获取数据并返回JSON。很多逻辑看似简单,但不能只看不练,只有多加练习,才能学以致用,融会贯通。先不要想着怎么把它做的最好,而是要先做出来v0.1版本,先别管好不好,先能运行起来,后面再慢慢优化。原创 2024-10-17 15:59:49 · 1110 阅读 · 0 评论 -
Go语言Gin框架的常规配置和查询数据返回json示例
在 上一篇文章中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案,这一篇文章继续分享一下go语言的Gin框架的一些常规配置和业务中常用的查询数据库并返回json的实现方案。Gin是一个golang的微框架,基于 httprouter,具有快速灵活,容错率高,高性能等特点。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。原创 2024-10-15 17:25:36 · 1387 阅读 · 0 评论 -
使用Go语言的gorm框架查询数据库并分页导出到Excel实例
使用Go语言的gorm框架查询数据库并分页导出到Excel实例,导出数据部分,考虑到数据量可能较大,如果一次性查询全量数据,可能造成内存或CPU爆满,因此不建议一次性全部导出,而是采用分页导出到多个文件,然后再将多个文件合并为一个Excel表格文件。原创 2024-10-09 16:20:09 · 1466 阅读 · 5 评论 -
2024年了,go xorm生成mysql的结构体这么操作
xorm是一个Go语言的ORM库,支持多种数据库,包括MySQL、PostgreSQL、SQLite、Oracle和SQL Server,并提供了丰富的查询语言。查了很多资料都和上面的解决方案类似,但是如今已经2024年9月了,我试了下上面的方案已经走不通了。后来根据xorm官网(https://xorm.io/) 的描述,现在需要安装`reverse`才能实现。踩了一些列坑之后,总结方法和操作步骤如下。原创 2024-09-20 17:13:37 · 1035 阅读 · 0 评论 -
Go语言Gin框架Logrus日志管理和token身份验证
RSA加密是一种非对称加密,可以在不直接传递密钥的情况下完成解密,这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。Logrus是一个结构化的Go日志框架,功能强大,具有高度的灵活性,它提供了自定义插件的功能,有TEXT与JSON两种可选的日志输出格式。相比RSA,ECDSA优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在公开密钥加密和电子商业中RSA被广泛使用。原创 2023-10-31 10:47:40 · 564 阅读 · 0 评论 -
Go语言的TCP和HTTP网络服务基础
TCP/IP 网络模型实现了两种传输层协议:TCP 和 UDP,实现网络编程,不仅可以基于应用层协议的HTTP,也可以直接基于传输层暴露给用户的网络编程接口:Socket(套接字)。Go语言的socket服务端程序通常采用一个 Goroutine 处理一个连接,主要关键词是Listen和Accept;使用 http.Get函数获取一个HTTP请求的返回信息,http.Server类型是基于 HTTP 协议的服务端,其中ListenAndServe方法的功能是:监听一个基于 TCP 协议的网络地址。原创 2023-06-18 21:14:01 · 1674 阅读 · 0 评论 -
Go 语言标准库常用的代码包
Cap方法提供的是内容容器的容量,不是内容长度。如果存在两个迭代变量,那么赋给第一个变量的值 就是当前字节序列中的某个 UTF-8 编码值的第一个字节所对应的那个索引值,赋给第二个变量的值 是这个 UTF-8 编码值代表的那个 Unicode 字符,其类型会是rune。strings.Builder与string值存储内容的方式是一样的:其中有一个内容容器,是一个byte类型的切片(字节切片),底层数组是一个字节数组,都是通过一个unsafe.Pointer类型的字段指向了底层字节数组的指针值。原创 2023-06-14 19:25:29 · 895 阅读 · 0 评论 -
Go语言中sync.Map、sync.Pool和Context的用法
map 不是并发写安全的,不支持同时并发读写,如果对 map 实例进行并发读写,程序运行时就会抛出异常,因此Go 1.9 版本中引入了支持并发写安全的 sync.Map 类型,可以用来在并发读写的场景下替换掉 map。sync.Pool 用来保存一组可独立访问的临时对象,这个“临时对象”会在未来的某个时候被垃圾回收掉。sync.Pool临时对象池是线程安全的,可以主要用作数据的缓存;会有锁的开销。Context是上下文信息,此类值是并发安全的,可以传播给多个 goroutine。原创 2023-05-19 12:25:52 · 1288 阅读 · 0 评论 -
Go语言中sync.Cond、atomic原子性和sync.Once的用法
sync包中关于 sync.Cond 、atomic原子性 和 sync.Once 的用法。条件变量提供的方法有三个:等待通知(wait)、单发通知(signal)、广播通知(broadcast);原子操作可以被用于共享数据的并发同步,Go语言中关于原子性相关的函数在标准库sync/atomic中;sync.Once用来执行且仅仅执行一次动作,常常用于单例对象的初始化场景。Once类型使用互斥锁和原子操作实现了功能。原创 2023-05-18 13:48:38 · 710 阅读 · 0 评论 -
Go语言中sync.Mutex和sync.WaitGroup的用法
Go 并发编程中存在的难题:并发编程不像是传统的串行编程,程序的运行存在着很大的不确定性。Go语言中使用sync.Mutex实现互斥锁,使用sync.RWMutex实现读写互斥锁,使用sync.WaitGroup是用来做任务编排的,要解决的就是并发等待的问题。互斥锁 sync.Mutex 是一个结构体类型,属于值传递,因此使用的时候会产生副本。原创 2023-05-17 12:30:00 · 780 阅读 · 0 评论 -
Go语言的并发:goroutine和channel
goroutine 是由 Go 运行时(runtime)负责调度的、轻量的用户级线程,为并发程序设计提供原生支持。Go 语言通过 go关键字+函数/方法 的方式创建一个 goroutine,使用 make 函数创建channel。channel是goroutine之间的数据通信通道,分为无缓冲channel和带缓冲channel,还有单向channel,无缓冲channel是用同步的方式传递数据,带缓冲channel是用异步的方式传递数据。select语句用于多路选择。原创 2023-05-16 14:23:38 · 807 阅读 · 0 评论 -
Go语言中使用组合来实现“继承”
在 Java和PHP中都是使用extends关键字实现类的继承的,那么Go语言中如何实现“继承”呢?其实Go语言是不支持经典面向对象的编程范式与语法元素,说是“继承”,实际上是一种组合的思想,是通过 Go 语言的类型嵌入(Type Embed)来实现的。类型嵌入是在一个类型的定义中嵌入了其他类型,Go 语言支持两种类型嵌入,分别是接口类型嵌入和结构体类型嵌入。接口类型只能嵌入接口类型,而结构体类型可以嵌入任意自定义类型或接口类型。原创 2023-05-15 14:55:41 · 679 阅读 · 0 评论 -
Go语言的接口类型interface
接口类型是由 type 和 interface 关键字定义的一组方法集合,Go 语言中的接口类型与它的实现者之间的关系不需要像其他语言(比如 Java / PHP)使用 implements 关键词修饰,实现者只需要实现接口方法中的全部方法即可(鸭子类型)。在 Go 语言中,将任意类型赋值给一个接口类型变量就是装箱操作,接口类型的装箱实际就是创建一个 eface 或 iface 的过程,经过装箱后,新分配的内存空间中的数据与原变量就没有关系了。原创 2023-05-14 22:15:56 · 1202 阅读 · 0 评论 -
Go语言的结构体、方法、指针
定义一个结构体使用 type 和 struct 关键词,Go语言中的方法本质上也是函数,只是多了一个receiver 参数。每个方法只能有一个 receiver 参数,并且receiver 参数名字要保证唯一,receiver 参数的基类型本身不能为指针类型或接口类型。方法声明要与 receiver 参数的基类型声明放在同一个包内。receiver 参数类型对 Go 方法有哪些影响?原创 2023-05-14 11:46:17 · 938 阅读 · 0 评论 -
Go语言的错误和异常处理:error、panic和recover
在Go语言中,一般使用 error 这个接口类型表示错误,并且通常将 error 类型返回值放在返回值列表的末尾;error 接口类型是 Go 原生内置的类型,Go 在标准库中提供了两种构造错误值的方法: errors.New 和 fmt.Errorf,这两种方法只限于以字符串形式返回错误信息。Go 1.13 及后续版本中,尽量用errors.Is和errors.As函数。原创 2023-05-13 18:48:57 · 1764 阅读 · 0 评论 -
Go语言的函数和defer用法
Go 语言中的函数参数不管使用哪种数据类型都是值传递,Go语言的变长参数实际上是通过切片来实现的;Go语言中函数被称为是“一等公民”,主要体现在:函数可以存储在变量中,也可以拥有自己的类型,以及闭包的使用;在Go语言的函数中可以使用defer延迟处理释放资源,采用先进后出“栈”的数据结构。原创 2023-05-13 09:48:15 · 682 阅读 · 0 评论 -
Go语言的条件判断和循环语句
Go语言的条件判断有 if 和 switch-case 两种形式;循环结构只有 for 这一种形式,去掉了传统语言中的 while 和 do-while 循环结构;Go 中 switch 分支结构中每个 case 语句不需要以 break 收尾,并且支持 fallthrough 穿透到后面的分支。原创 2023-05-12 15:37:53 · 584 阅读 · 0 评论 -
Go语言中array、slice、map的用法和细节分析
本文主要讲述Go语言中的复合数据类型:数组(array)、切片(slice)、映射(map),内容包括数组和切片的区别以及map的基本用法和开发中常见的细节问题。Go 语言的数组类型属于值类型,map和切片都是引用类型, 因此当 map 类型变量作为参数被传递给函数或方法的时候,在函数内部对 map 的修改会影响函数外部的值。切片只能和nil比较,不能两个切片对比。map 不是并发写安全的,不支持同时并发读写。原创 2023-05-11 22:45:17 · 351 阅读 · 0 评论 -
Go语言的基本数据类型:整型、浮点型、字符串
本篇内容主要讲解Go语言的基本数据类型:整型int相关,浮点型float相关,布尔bool,以及字符串string,还有不同数据类型之间的转换,以及如何自定义一个数据类型。文章中的代码仅供示例参考,更多详细代码和用法请参考gitee上的源代码。原创 2023-05-11 17:24:07 · 1574 阅读 · 0 评论 -
Go语言中的变量、常量和代码块
Go语言的两类变量:一种是包级变量(package varible),也就是在包级别可见的变量。通常会将同一类的变量声明放在一个 var 变量声明块中,不同类的声明放在不同的var 声明块中;iota是 Go 语言的一个预定义标识符,它表示的是 const 声明块(包括单行声明)中,每个常量所处位置在块中的偏移值(从零开始),每个 const 代码块的 iota都是从0开始。在 Go 语言中,一对不包裹任何内容的花括号,除了可以代表空的代码块之外,还可以用于表示不包含任何内容的数据结构(或者说数据类型)原创 2023-05-10 23:41:25 · 493 阅读 · 0 评论 -
Go语言的安装和包依赖管理
本文先从golang的安装开始,然后介绍了不同版本的Go如何管理依赖,以及Go语言的执行顺序。以及简单介绍了Go的原生并发支持,采用了用户层轻量级线程,Go 将之称为 goroutine。一个 Go 程序中可以创建成千上万个并发的 goroutine,并且所有的 Go 代码都在 goroutine 中执行。原创 2023-05-10 17:07:00 · 2009 阅读 · 0 评论 -
Go语言Gin框架接入Consul实现微服务注册发现
Gin是一个使用Go语言开发的Web框架。它提供类似Martini的API,但性能更佳,速度提升高达40倍。本文使用Gin框架简单的实现了数据库的查询功能,基于Go ORM的查询;然后又接入Consul微服务实现了服务注册和发现。原创 2023-05-07 20:56:03 · 1567 阅读 · 0 评论