go
文章平均质量分 50
leo_jk
分享技术,同行一起进步!
展开
-
golang 对接第三方接口 RSA 做签(加密) 验签(解密)
1.调用第三方接口前,一般需要按规则将参数按key1=value1&key2=value2 阿斯克码排序,sign参数不参与加密2.将排序并连接好的参数字符串通过我方的私钥证书(.pem)进行加密得到加密串,当然加密得到的是 []byte 字节流,需要将字节流转换成base64字符串3.将加密字符串赋值给sign参数,并与其他加密参数一起通过post (application/x-www-form-urlencoded )请求第三方接口。原创 2024-03-20 21:55:14 · 965 阅读 · 0 评论 -
golang 字符串操作、处理
字符串操作、处理原创 2023-07-30 22:46:13 · 987 阅读 · 0 评论 -
golang json.Marshal() 结构体、map 携带 &符号 转成 “\u0026“
json.Marshal() 函数,此函数会将 值中的 & < > 符号转义 为 类似 "\u0026"像我们某个结构体中携带了 路径及参数 http://baidu.com?a=123&b=456,那么转义了就会出错,问题:数据结构中的值 带有 & > < 等符号,当我们要将 struct map 转成json时,使用。原创 2023-07-29 16:52:52 · 1372 阅读 · 0 评论 -
golang操作 redis发布/订阅消息
golang 操作redis发布订阅消息原创 2023-04-14 16:04:48 · 709 阅读 · 0 评论 -
golang 时间处理
golang 时间处理原创 2023-04-12 13:46:08 · 805 阅读 · 0 评论 -
golang对接rabbitMQ
golang对接rabbitMQ发送 消费消息,代码实现原创 2023-04-08 15:35:12 · 1485 阅读 · 0 评论 -
golang im聊天核心结构(websocket)
golang websocket实现im聊天原创 2023-04-06 13:14:07 · 1308 阅读 · 1 评论 -
gin框架 数据验证validator 并输出中文报错信息
gin 表单数据验证,完全转中文并单个错误返回原创 2023-03-31 21:21:09 · 1411 阅读 · 0 评论 -
golang 去重算法
golang 去重算法原创 2023-01-09 21:39:21 · 351 阅读 · 0 评论 -
go defer return panic 执行顺序
go defer return panic 执行顺序原创 2023-01-09 02:07:44 · 900 阅读 · 0 评论 -
gin web开发模板渲染
gin web开发模板渲染原创 2023-01-03 23:17:25 · 411 阅读 · 0 评论 -
golang 数据类型转换
golang 数据类型转换原创 2023-01-03 20:07:02 · 1120 阅读 · 1 评论 -
golang viper读取yaml配置文件配置
viper读取yaml配置文件配置原创 2023-01-03 00:34:20 · 2251 阅读 · 0 评论 -
golang 自定义命令行flag包简单使用
自定义命令行flag包原创 2023-01-01 22:23:58 · 1055 阅读 · 1 评论 -
golang 某个函数作为参数传入另一个函数内并执行
函数作为参数传入另一个函数内并执行原创 2023-01-01 18:55:45 · 941 阅读 · 0 评论 -
go 中间件洋葱模型
golang中间件洋葱模型原创 2023-01-01 18:07:53 · 403 阅读 · 0 评论 -
go map
map声明、初始化、curd、遍历、引用类型原创 2022-06-12 22:11:18 · 349 阅读 · 0 评论 -
go 切片(创建、nil切片、空切片、切片拷贝)
1.切片就是一个“动态”数组,即切片的长度是可以伸缩的。其数据结构是一个结构体,包含三个字段,指向数组的指针、长度、容量。2.切片的指针指向某个数组,所以它是引用类型。1.申明并创建(分两步:1-声明 2-make初始化)2.直接make()创建3. 推导make创建4.从数组中截取三、nil切片和空切片1.nil切片:声明为切片,但是没有分配内存。切片的指针是nil注意:只有声明的切片才会产生nil切片,通过推导或数组截取的切片都是指针有指向的。2.空切片:切片指原创 2022-06-12 18:27:13 · 2631 阅读 · 2 评论 -
go对接kafka
1.生产者,生产消息使用github.com/Shopify/sarama包 对接kafkapackage mainimport ( "fmt" "github.com/Shopify/sarama" "strconv" "time")func main() { //初始化配置 config := sarama.NewConfig() config.Producer.RequiredAcks = sarama.WaitForAll //follow同步数据后返回 co..原创 2022-04-08 16:43:44 · 2268 阅读 · 0 评论 -
go ReverseProxy 实现http代理负载均衡
一、构建两个应用服9091 和 9092端口package mainimport ( "encoding/base64" "log" "net/http" "os" "os/signal" "strings")type web1handler struct {}func(web1handler) ServeHTTP (writer http.ResponseWriter,request *http.Request) { //请求头是否有给到 Authorization 信原创 2022-04-07 23:24:23 · 648 阅读 · 0 评论 -
gin jwt-go 生成token及jwt中间件验证
一、定义jwt中间件,同时将 生成token、验证token、token中间件handlerfunc都写在中间件文件中基于github.com/dgrijalva/jwt-go 包 、gin框架obj/middleware/jwt.go注意:我们的签名算法用的是 jwt.SigningMethodHS256 其他方法报错:key is of invalid typepackage middlewareimport ( "github.com/dgrijalva/jwt-go"...原创 2022-03-27 19:34:02 · 3135 阅读 · 3 评论 -
go 时间戳转日期格式,日期格式转时间戳
1.某个日期格式字符串转时间戳注意:时间模板必须是2006年1月2日15时4分5秒,时间格式可以是2006-01-02 15:04:05或2006/01/02 15:04:05//日期时间字符串timeStr := "2022-02-01 10:45:15"//要转换成时间日期的格式模板(go诞生时间,模板必须是这个时间)timeTmeplate := "2006-01-02 15:04:05"tim ,_ := time.Parse(timeTmeplate ,timeStr).原创 2022-03-26 14:05:03 · 6987 阅读 · 0 评论 -
go gorm连表查询,表取别名
连表查询实例:两个表的数据接收数据结构体:type NewsAll struct { Id int `json:"id" gorm:"column:id"` Title string `json:"title" gorm:"column:title"` Content string `json:"content" gorm:"column:content"` CateId int `json:"cate_id" gorm:"column:...原创 2022-03-25 21:48:35 · 4672 阅读 · 0 评论 -
go 无限极分类实现 返回树状排列数据 或 树状层级数据
根据从数据表中查询的多条数据得到树状数据。数据表中根据 id 与 pid进行区分上下级具体实现如下:1.分类排列:// Menu 菜单type Menu struct { Id int Pid int CateName string Desc string CreateTime int Children []Menu}// TreeList 菜单type TreeList struct { Id int Pid int CateName string Desc原创 2022-03-25 11:38:48 · 1961 阅读 · 0 评论 -
go gin(2)中间件
一、中间件所谓的中间件,是一个请求到达服务器具体服务前或者服务处理后返回前,加了一层处理逻辑。当然,这层逻辑如果在每个处理逻辑前加上这段重复的代码肯定是不好的,所以将这段通用的代码抽离出来,以插件化的形式进行对接,这种方式既保证了系统功能的完整性,又有效的将具体的业务逻辑与系统的功能解耦,并且可以达到灵活配置的目的。我们实际应用当中比如,在客户端请求到达时,我们先要对用户是否登录、用户权限进行验证,或者请求处理后,将此次请求写入日志。所以中间件有前置操作和后置操作。中间件的具体角色位置如下图:原创 2021-07-14 15:00:52 · 281 阅读 · 0 评论 -
go gin框架(2),路由分组
我们开发功能的时候都是分模块的,比如用户处理模块、商品处理模块、日志处理模块.....那么我们的路由也是可以分组的:比如我们的用户模块http://localhost:8000/user/registerhttp://localhost:8000/user/loginhttp://localhost:8000/user/infohttp://localhost:8000/user/loginout从这几个访问连接中可以知道,都是处理用户user的url在gin框架中,能对路由进行原创 2021-07-12 00:59:05 · 854 阅读 · 0 评论 -
go gin框架(1),http
一、gin 下载:命令:go get -u github.com/gin-gonic/gin注意:需要配置代理,因为屏蔽了。配置env, go env -w XXX=???GO111MODULE=onGOPROXY=https://goproxy.cn,direct更改了环境变量后,就可以用go get下载,但是如果用的是module(下载的包会放到pkg文件夹下,需要mod自动导包),那么就需要创建项目,并初始化mod,再下载比如:GOPATH/ginobject ...原创 2021-07-11 00:33:09 · 535 阅读 · 1 评论 -
go 文件操作
一、文件就是保存数据的一种形式。比如我们经常用到的,word文档、txt文本文档、excel文件都是用来保存数据的。当然文件也可以是一张图片、一段音频、一个小电影.....总之它就是用来保存数据的。二、输出流和输入流,因为文件在程序中是以流的形式来操作的流:数据在数据源文件和程序(内存)之间流动所经历的路径输入流:数据从文件流动到程序内存的路径。(将硬盘里的数据提取到内存中)输出流:数据从程序内存到数据源文件的路径。(将内存中的数据刷回到硬盘存储)三、go中对文件操作的包os.Fil原创 2021-07-05 16:07:55 · 386 阅读 · 0 评论 -
go interface接口案例
当我们要对一个切片进行排序时,可以用系统提供的sort排序,也可以用冒泡排序、快速排序来实现。另外我们也能通过实现sort.Sort()的接口方法来实现查看sort()的源代码,源代码里就是通过接口的三个方法来实现排序的根据如上:我们可以实现对一个结构体切片进行排序,思路就是实现sort的三个方法。注意:如下代码中,Less方法 是对比相邻两个元素中对应字段值大小package mainimport ( "fmt" "math/rand" "sort")原创 2021-07-05 09:55:11 · 113 阅读 · 0 评论 -
go interface接口类型
接口类型可以定义一组没有方法体的方法。基本语法:type 接口名 interface { method1(参数列表)返回值列表 method2(参数列表)返回值列表 ...}要注意的是:1.接口变量内不能包含变量2.接口里的方法都没有方法体(即没有实现的方法)3.接口的实现不用像其他语言一样显示的声明实现。只需一个变量含有接口类型中的所有方法(是所有方法)4.因为不是显示的实现接口,那么如果两个不同名的接口有一样的方法,一...原创 2021-07-05 00:26:09 · 1442 阅读 · 0 评论 -
go 面向对象-继承
一、go 面向对象继承: B继承A, 即在B结构体中 声明 A匿名结构体1.结构体可以使用嵌套匿名结构体的所有字段加方法(即:同一个包中,首字母大写和小写的字段、方法,都可以使用)2.匿名结构体的字段和方法访问,调用可以简化, A.B.Name A.Name。但是当结构体中有与匿名结构体中相同的方法时,情况就不同3.当结构体和你们结构体有相同的字段或者方法时,编译器采用的是“就近访问原则”访问,如果希望访问匿名结构体中的字段或方法,可以通过匿名结构体名称来区分。当我们使用结构体中的方法时..原创 2021-07-04 15:04:51 · 487 阅读 · 2 评论 -
go select特性
select作用域switch类似,但是这个关键字是用于监听channel有关的IO操作,当IO操作发生时,触发selec的动作执行机制。1.当有多个可执行的case,那么select将公平的随机选取一个case执行。多个case可执行:多个case 通道可以 发送或接受数据公平的随机:则是相对公平的去分配机制,根据具体情况来随机选取一个case执行:每次都只会选择一个case执行,所以往往select都是配置for进行循环使用的2.当所有的case对应的通道被阻塞 (数据已满被阻塞、.原创 2021-07-04 03:14:38 · 154 阅读 · 0 评论 -
go 工厂模式
go所谓的工厂模式其实就是: 包内一个不可直接实例的结构体(结构体名称首字母小写),包外不可直接实例,那么为了解决这个问题,就写一个包外可调用的函数,通过这个函数实现返回结构体对象。例如: 创建两个包,main、 model, main包中要获取model包的实例,并使用。实现方法如下:src/test/main/main.gosrc/test/model/model.go1.main.go代码package mainimport ( "fmt" "test/model")原创 2021-07-04 01:17:16 · 1079 阅读 · 0 评论 -
go 面向对象 方法
一、go的面向对象,通过将方法与结构体变量进行绑定(当然方法也可以与其他数据类型进行绑定)。func(t T)methodName(参数列表) (返回值列表){}package mainimport "fmt"type Person struct{ Name string Age int}func (p Person)Say() { fmt.Println(p.Name,"say hello")}func main() { p := Person{"Nomen",18}原创 2021-07-03 13:07:01 · 1270 阅读 · 0 评论 -
go 结构体struct
1.结构体声明: type 结构体名 struct , 字段: field type type Person struct{ Name string Age int}2.结构体名称首字母小写,则包外部不能使用。大写则包外部能使用。 字段名称首字母大写,包外部才能访问,首字母小写包外部不能访问。3.字段的数据类型:可以是基本数据类型、数组或引用类型4.创建一个结构体变量以后,如果没有给字段赋值,都对应的是一个“零值”(默认值),默认值规则如下: 布尔类型是...原创 2021-07-02 17:42:08 · 719 阅读 · 1 评论 -
go channel
channel 特性:1.用于协程间的通信2.发送给通道的数据以队列的形式排列3.多个协程从channel中取数据是数据安全的,它具有原子性,channel中每次只能给一个线程取数据4.channel中没有数据,取数据的协程就会阻塞,等待channel中有新的数据放入5.同一个协程内 不能向channel中放入数据又取出数据,这样会导致死锁。6.无缓冲channel与有缓冲的channel区别很大:打个比喻:快递员送快递, 无缓冲的就是:快递员将快递送到你家,你不在家他不走(阻塞原创 2021-07-01 21:19:00 · 100 阅读 · 0 评论 -
go并发(3),CAS 是实现互斥锁和同步原语的基础
互斥锁就是让多个协程中只能有一个得到锁。其实现需要有原子性。go的原子性就是通过CAS CPU指令实现的CAS(比较与交换,Compare and swap)是一种有名的无锁算法。CAS, CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并原创 2021-06-29 00:55:28 · 459 阅读 · 0 评论 -
go并发(2),临界区加排他锁示例
多个线程并发执行计数时,给临界区加锁进行数据保护代码示例: 开10个协程 每个协程将计数器进行10万次的 加一操作。我们理想的状况是计数器最终是100万。(不加排他锁,则计数器数据会因为并发出现不是我们需要的结果)package mainimport ( "fmt" "sync")// 开启10个协程 每个协程改写变量10万次,但是运行程序在不加互斥锁的情况下,变量得到的结果不是100万// 需要知道并发修改公共资源的临界区在哪,在临界区加锁func main() { var原创 2021-06-28 22:22:00 · 340 阅读 · 0 评论 -
go 并发(1)并发场景及解决对应场景的要用到的基础同步原语
并发原语 Synchronization primitives 直译,同步原语 用于做协程同步、编排的类型或工具。并发原语比 同步原语包括的范围更广泛。go中的同步原语有:Channel(管道)、WaitGroup(线程等待)、Mutex(互斥锁)、RWMutex(读写锁)、Cond(条件变量)并发的场景有:1.共享资源。并发的读写共享资源,会出现数据竞争的问题,所以共享资源需要保护起来,避免竞争产生的错乱。所以会用到 Mutex(互斥锁)、RWMutex(读写锁)来保护数据安全。2.任原创 2021-06-28 21:45:13 · 286 阅读 · 0 评论 -
go 文件内容导入到另一个文件,复制文件
1.将A文件内容复制到B文件中去(B文件原来是有数据的将会被清除掉)package mainimport ( "errors" "fmt" "io/ioutil")//copyData 将源文件数据导入到目标文件中去(目标文件为空文件)func copyData(sourcePath,targetPath string) error { data,err := ioutil.ReadFile(sourcePath) if err != nil { return errors.N原创 2021-06-27 00:27:37 · 660 阅读 · 0 评论