
GO
文章平均质量分 69
dz45693
我是一个软件开发人员,有较强的责任心,是一个典型的技术爱好者。在此希望能认识更多好朋友。
展开
-
由浅入深聊聊Golang的sync.Pool
在下一个周期到来前,victim 中的缓存对象可能会被偷取,在 Put 操作后又重新回到 local 中,这个过程发生在从其他 P 的 shared 队列中偷取不到、以及 New 一个新对象之前,进而是在牺牲了 New 新对象的速度的情况下换取的;这样,当其他线程想要读取 1 号索引时,发生 cache miss,还得重新再加载,对性能有损。而 sync.Pool 可以将暂时不用的对象缓存起来,待下次需要的时候直接使用,不用再次经过内存分配,复用对象的内存,减轻 GC 的压力,提升系统的性能。转载 2023-10-24 22:17:55 · 630 阅读 · 1 评论 -
如何使用JavaScript实现在线Excel附件的上传与下载?
在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不过和本地不同的是,Web端不会直接打开附件,而是使用超链接单元格的形式来显示,今天小编将为大家介绍使用前端HTML+JS+CSS技术通过超链接单元格的形式实现在线Excel附件上传、下载和修改的操作。转载 2024-06-18 19:52:49 · 265 阅读 · 0 评论 -
深入理解Go语言中的sync.Cond
对于Read方法,因为其不运行并发访问,当其将退出时,说明此时已经没有协程在读取数据了,满足abortPendingRead继续执行下去的条件了,此时可以调用Boardcast来唤醒等待条件满足的协程。这个其实就是sync.Cond设计的用途,当不满足运行条件时,先进入阻塞状态,等待条件满足时,再由其他协程来唤醒,然后再继续运行下去,能够提高程序的执行效率。在接下来的部分中,我们介绍了 sync.Cond 的实现原理,主要是对等待队列的使用,从而sync.Cond有更好的理解,能够更好得使用它。转载 2023-10-24 21:51:00 · 709 阅读 · 0 评论 -
玩转 Go 生态|Hertz WebSocket 扩展简析
WebSocket 是一种可以在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。提供了的支持,参考库使用hijack的方式在 Hertz 进行了适配,用法和参数基本保持一致。转载 2022-12-15 15:17:38 · 1733 阅读 · 1 评论 -
[Go疑难杂症]为什么nil不等于nil
接口类型变量跟普通变量是有差异的,非空接口类型变量对应的底层结构是iface,空接口类型类型变量对应的底层结构是eface。iface中有两个跟类型相关的字段,一个表示的是接口的类型inter,一个表示的是变量实际类型_type。只有当接口变量的itab._type与 data 都为nil时,也就是实际类型和值都未被赋值前,才真正等于nil。转载 2022-10-27 15:25:11 · 1168 阅读 · 1 评论 -
go gorm select * 优化
很多时候sql查询都不允许select * 出现要求指定列名,如果你是用gormv2 ,恭喜你可以使用QueryFields属性,如果是gormv1版本怎么样,难道要升级gormV2吗,这里提供种反射的实现,可能不是最优解,但只是一个方案。首先mysq建一个表。原创 2022-09-17 14:00:34 · 2272 阅读 · 1 评论 -
go 操作 Excel
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要转载 2022-07-18 11:35:07 · 1907 阅读 · 1 评论 -
go Http客户端
理解 timeouttimeout 又可以细分为 connect timeout、read timeout、write timeout。而 read timeout 和 write timeout 必须是在 connect 之后才能发生。ReadTimeout的时间计算是从连接被接受(accept)到request body完全被读取(如果你不读取body,那么时间截止到读完header为止) WriteTimeout的时间计算正常是从request header的读取结束开始,到response转载 2022-05-16 15:46:26 · 4176 阅读 · 0 评论 -
go 二维码解析推荐gozxing
生成二维码的开源项目可谓是琳琅满目,SwetakeQRCode、BarCode4j、Zxing,前端有JQuery-qrcode,同样能实现生成二维码。选择Zxing的原因可能是对 Google 公司的信赖和个人崇拜吧。参考:GitHub - makiuchi-d/gozxing: Port of ZXing (https://github.com/zxing/zxing) core to pure Go.package mainimport ( "fmt" "imag...原创 2022-05-07 18:18:18 · 2373 阅读 · 0 评论 -
go实现 银行卡Luhn校验
一、银行卡号码的校验规则银行卡号码的校验采用Luhn算法,校验过程大致如下:1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。4. 如果s能够整除10,则此号码有效,否则号码无效。因为最原创 2022-04-20 12:35:07 · 2525 阅读 · 0 评论 -
go smtp示例
书接上文邮件实现详解,这里我们及我们简单复习一下smtp的指令如下:telnet smtp.163.com 25[outpout]ehlo dz45693[outpout]auth login[outpout]输入用户名base64[outpout]输入密码base64mail from:<dz45693@163.com>[outpout]rcpt to:<dz45693@sina.com>[outpout]data[outpout]from:&l原创 2022-03-13 21:04:09 · 3968 阅读 · 0 评论 -
go GCM加密解密 gin中间件加密解密,gin文件流处理
要给已有的系统启用加密解密,目前推荐的是aes的gcm模式的加密和解密,在微服务如果向前有公共方法处理 读取数据和写返回数据,那么比较简单,修改以前的公共方法,但是这样本地调试平时肯定是明文,所以要加判断,如果以前的读数据和写数据是五花八门那就比较麻烦,在微服务体系里面一般有网关这个服务,所以加密和解密就放在网关服务,大致如下:常规的请求有GET,POST JSON, POST file,以及POST Form表单,返回一般是json 或者下载文件流,所以我们需要截获请求流和返回流,收到请求流解密数原创 2022-03-10 22:21:51 · 4456 阅读 · 0 评论 -
Gin 通用的日志中间件
main.gopackage mainimport ( "demo/gindemo/middleware" "github.com/gin-gonic/gin" "net/http")func main() { // 1.创建路由 r := gin.Default() r.Use(middleware.Logger()) r.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "hello World!")原创 2022-02-12 13:43:29 · 3811 阅读 · 1 评论 -
Go websocket 聊天室demo2
上文Go websocket 聊天室demo以及k8s 部署 后面有一个问题, 如果2个客服端 分别来链接到不同的服务 如何发布消息了?如图:cliant A ->ServerA ----推送消息到kafka---->推送消息到 服务A和B---->服务AB都去寻找自己的client集合------>发送消息给具体的客户端【有可能是广播 也可能是指定具体的用户】代码:package mainimport ( "context" "encoding/...原创 2022-01-09 16:25:06 · 3247 阅读 · 0 评论 -
Go websocket 聊天室demo以及k8s 部署
本来打算练习go websocket 做一个示例,结果在网上找了一个聊天室的示例【Go websocket 聊天室的详细实现和详细分析_上官二狗的博客-优快云博客_go websocket 聊天室】,感觉不错就拿来用一下。介绍首先需要有一个客户端 client 的 manager ,manager 里应该保存所有的client 信息所以在我们的程序里定义了 ClientManager 这个结构体用 clients 这个 map 结构来保存所有的连接信息遍历 clients 通过使用 bro.原创 2022-01-09 09:32:28 · 2928 阅读 · 0 评论 -
go redis 工具锁
redis经常用作分布式锁,这里记录一个简单的锁代码如下:package mainimport ( "crypto/rand" "encoding/base64" "fmt" "github.com/go-redis/redis" "io" "sync" "time")func main() { addr := "192.168.100.30:6379" rdb := redis.NewClient(&redis.Options{ Addr: addr,原创 2021-11-29 19:52:34 · 3119 阅读 · 0 评论 -
Kafka(Go)---Producer-Consumer API 基本使用
本文主要讲解其中的 Producer API 和 Consumer API 在 Go Client sarama 中的使基本使用以及注意事项。1. 概述Kakfa 相关代码见GithubKafka 有 5 个核心 API:Producer API Consumer API Stream API Connect API Admin API在 Go sarama 客户端中暂时只实现了 Producer、Consumer、Admin 3 个API。其中 Stream API .转载 2021-11-27 16:20:50 · 2203 阅读 · 0 评论 -
Go语言之 Context 实战与源码分析
本文主要简单介绍了Go语言(golang)中的context包。给出了context 的基本用法和使用建议,并从源码层面对其底层结构和具体实现原理进行分析。1. 概述以下分析基于 Go 1.17.11.1 什么是 Context上下文 context.Context在Go 语言中用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与 Goroutine 有比较密切的关系,是 Go 语言中独特的设计,在其他编程语言中我们很少见到类似的概念。主要用于超时控制和多Goroutine间转载 2021-11-27 14:44:33 · 2667 阅读 · 0 评论 -
golang 时间missing Location in call to Date
golang使用"Asia/Shanghai"时区转换时间格式报:missing Location in call to Date当然解决方法1是:time.FixedZone //os.Setenv("ZONEINFO","D:\\ProgramFiles\\Go\\lib\\time\\zoneinfo") loc, err := time.LoadLocation("Asia/Shanghai") //设置时区 if err != nil { loc = time.FixedZ原创 2021-11-19 12:21:25 · 3198 阅读 · 0 评论 -
Go 每日一库之 fsnotify
简介上一篇文章Go 每日一库之 viper中,我们介绍了 viper 可以监听文件修改进而自动重新加载。其内部使用的就是fsnotify这个库,它是跨平台的。今天我们就来介绍一下它。快速使用先安装:$ go get github.com/fsnotify/fsnotify后使用:package mainimport ( "log" "github.com/fsnotify/fsnotify")func main() { watcher, err := fs转载 2021-10-12 22:15:58 · 4204 阅读 · 0 评论 -
Go 每日一库之 gojsonq
在日常工作中,每一名开发者,不管是前端还是后端,都经常使用 JSON。JSON 是一个很简单的数据交换格式。相比于 XML,它灵活、轻巧、使用方便。JSON 也是RESTful API推荐的格式。有时,我们只想读取 JSON 中的某一些字段。如果自己手动解析、一层一层读取,这就变得异常繁琐了。特别是在嵌套层次很深的情况下。今天我们介绍gojsonq。它可以帮助我们很方便的操作 JSON。快速使用先安装:$ go get github.com/thedevsaddam/gojsonq后使用:转载 2021-10-12 22:12:38 · 3188 阅读 · 0 评论 -
Go 每日一库之 mapstructure
简介mapstructure用于将通用的map[string]interface{}解码到对应的 Go 结构体中,或者执行相反的操作。很多时候,解析来自多种源头的数据流时,我们一般事先并不知道他们对应的具体类型。只有读取到一些字段之后才能做出判断。这时,我们可以先使用标准的encoding/json库将数据解码为map[string]interface{}类型,然后根据标识字段利用mapstructure库转为相应的 Go 结构体以便使用。快速使用本文代码采用 Go Modules。首先创建转载 2021-10-12 11:54:35 · 5592 阅读 · 0 评论 -
Go 每日一库之 gabs
简介JSON 是一种非常流行的数据交换格式。每种编程语言都有很多操作 JSON 的库,标准库、第三方库都有。Go 语言中标准库内置了 JSON 操作库encoding/json。我们之前也介绍过专门用于查询JSON 串的库gjson和专门用于修改JSON 串的库sjson,还有一个非常方便的操作 JSON 数据的命令行工具jj。今天我们再介绍一个 JSON 工具库——gabs。gabs是一个用来查询和修改 JSON 串的库。它使用encoding/json将一般的 JSON 串转为map[strin..转载 2021-10-12 11:43:24 · 4241 阅读 · 0 评论 -
Go 每日一库之 goquery
简介goquery是用 Go 语言编写的一个类似于 jQuery 的库。它基于 HTML 解析库net/html和 CSS 库cascadia,提供与 jQuery 相近的接口。Go 著名的爬虫框架colly就是基于 goquery 的。快速使用本文代码使用 Go Modules。创建目录并初始化:$ mkdir goquery && cd goquery$ go mod init github.com/darjun/go-daily-lib/goquery安装g转载 2021-10-12 11:21:05 · 2754 阅读 · 0 评论 -
Go 每日一库之 sjson
快速使用先安装:$ go get github.com/tidwall/sjson后使用:package mainimport ( "fmt" "github.com/tidwall/sjson")const json = `{"name":{"first":"li","last":"dj"},"age":18}`func main() { value, _ := sjson.Set(json, "name.last", "dajun") fmt.Prin转载 2021-10-12 11:09:15 · 3145 阅读 · 0 评论 -
Go 每日一库之 gjson
快速使用先安装:$ go get github.com/tidwall/gjson后使用:package mainimport ( "fmt" "github.com/tidwall/gjson")func main() { json := `{"name":{"first":"li","last":"dj"},"age":18}` lastName := gjson.Get(json, "name.last") fmt.Println("last nam转载 2021-10-12 11:05:08 · 4031 阅读 · 0 评论 -
Go并发编程--GMP调度
简介服务端和客户端应该怎么进行通信呢?我们常见的方法就是客户端向服务器端发送一个请求,然后服务器端向客户端发送返回的响应。这种做法比较简单,逻辑也很清晰,但是在某些情况下,这种操作方式并不好使。比如在服务器端的某些变动需要通知客户端的情况,因为客户端并不知道服务器端的变动是否完成,所以需要不停的使用轮循去检测服务器的状态。这种做法的缺点就是太过于浪费资源。如果希望及时性好的话,需要不断的减少轮循的时间间隔,导致极大的服务器压力和资源的浪费。那么有没有好的解决办法呢?既然不能使用查询,那么就改转载 2021-09-23 11:29:13 · 1742 阅读 · 0 评论 -
Go并发编程--正确使用goroutine
目录1. 对创建的gorouting负责 1.1 不要创建一个你不知道何时退出的 goroutine 1.2 不要帮别人做选择 1.3 不要作为一个旁观者 1.4 不要创建不知道什么时候退出的 goroutine 1.5 不要创建都无法退出的 goroutine 1.6 确保创建出的goroutine工作已经完成 2. 总结 3. 参考1. 对创建的gorouting负责1.1 不要创建一个你不知道何时退出的 goroutine下面的代码有什么问题? 是不是转载 2021-09-21 15:14:59 · 1424 阅读 · 1 评论 -
skywalking安装以及使用go
1docker搭建skywalkingdocker-compose#docker-compose示例注意:如果本地有端口被占用的,请自行修改,另 elasticsearch 需要使用 5.x 版本,skywalking5.x版本不支持 6.x 版本的 elasticsearchversion: '2'services: elasticsearch: image: elasticsearch:5.6 container_name: elasticsearch .原创 2021-08-27 15:40:13 · 2703 阅读 · 0 评论 -
golang之数据验证validator
前言在web应用中经常会遇到数据验证问题,普通的验证方法比较繁琐,这里介绍一个使用比较多的包validator。原理将验证规则写在struct对字段tag里,再通过反射(reflect)获取struct的tag,实现数据验证。安装go get github.com/go-playground/validator/v10示例package mainimport ( "fmt" "github.com/go-playground/validator/v10")type原创 2021-05-17 17:54:07 · 2948 阅读 · 1 评论 -
Go jaegerde 应用【logger+gorm+grpc+http】
在以前的Go语言jaeger和opentracing有用来做日志,但是很多时候我们希望数据库的操作也可以记录下来,程序一般作为http或者grpc 服务, 所以grpc和http也是需要用中间件来实现的。首先看程序的目录, 只是一个简单的demo:来看看主要的几个文件logger.gopackage loggerimport ( "context" "fmt" "io" "runtime" "strings" "time" "github.com/opentracin.原创 2021-05-13 20:49:44 · 2289 阅读 · 0 评论 -
Go gRPC 调试工具
在开发grpc的时候,Go gRPC 调试工具可以说是必备工具。安装:go get github.com/fullstorydev/grpcui go install github.com/fullstorydev/grpcui/cmd/grpcuigrpcui -help #验证是否安装准备grpc项目,如:hello.proto 和main.gosyntax = "proto3";option go_package = "./;proto"; package pr.原创 2021-04-29 08:25:42 · 1919 阅读 · 1 评论 -
iris和xxl-job整合
在以前的文章中go任务调器gocron和xxl-job 尝试xxl和gin的整合,由于项目统一用iris 所以需要研究出如何与iris整合, 直接上代码:package mainimport ( "context" "fmt" "log" "github.com/kataras/iris/v12" "github.com/xxl-job/xxl-job-executor-go")func main() { exec := xxl.NewExecutor( xxl.Serv原创 2021-04-20 23:07:41 · 1696 阅读 · 0 评论 -
rocketmq事务 go 采用rocketmq-client-go的实现
用docker安装rocketMq#需要创建文件夹/docker/namesrv/logs/docker/namesrv/store/docker/rocketmq/logs/docker/rocketmq/store#需要创建文件/docker/rocketmq/broker.conf文件内容如下:brokerClusterName = DefaultClusterbrokerName = broker-abrokerId = 0deleteWhen = 04fileRes原创 2021-04-18 08:16:00 · 3126 阅读 · 0 评论 -
go kafka group
在一千的文章kafka初探go和C#的实现里面我们用了sarama来消费kafka的消息,但是很遗憾它没有group的概念。没办法 我们只能用sarama-cluster来实现, 注意sarama版本不要太新否则有错误panic: non-positive interval for NewTicker 问题处理,建议大家可以修改go.mod文件如下:require ( github.com/Shopify/sarama v1.24.1 github.com/bsm/sarama-cluster v原创 2021-03-16 14:58:21 · 2774 阅读 · 0 评论 -
jenkins自动化部署go【docker+jenkins+go+gitlab+harbor+k8s】
首先说一下我的环境,首先准备一台ubuntu18.4虚拟机,安装docker, 然后用docker 安装gitlab[大家可以参考 Ubuntu Docker搭建GitLab以及常规配置使用] 和harbor【大家可以参考 Ubuntu18 安装搭建Harbor】,我尝试过通过docker来安装jenkins,jenkins容器里面在安装docker和harbor通信,但是后面还是遇到很多问题 不好解决, docker默认是无状态的 需要保存的数据都要挂在的虚拟机上, 比如jenkins里面下载的gola.原创 2021-03-01 10:05:15 · 2786 阅读 · 0 评论 -
geoip【go和C#】
在项目中经常遇到通过ip获取区域信息,geoip无疑是一个很好的选择https://dev.maxmind.com/geoip/, 大家在这里可以下载IP库 。还有在ip中经常遇到字符串和数字的转换GOip数字和字符的转换我们可以用github.com/thinkeridea/go-extend/exnet包,获取ip信息可以用github.com/oschwald/geoip2-golang,代码如下:package mainimport ( "fmt" "log" "net".原创 2021-02-26 14:22:21 · 1785 阅读 · 0 评论 -
Go语言jaeger和opentracing
OpenTracing开放式分布式追踪规范,常见实现:jaeger和zipkindocker启动一个实例:docker run -p 5775:5775/udp -p 16686:16686 -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 14268:14268 jaegertracing/all-in-one:latestgo来一个普通的go程序package mainimport ( "f.原创 2021-02-19 17:45:08 · 1762 阅读 · 0 评论 -
go和asp.netCore读取nacos配置
上文docker安装nacos我们已经安装了nacos,现在我们来看看如何读取配置文件。我们的nacos的示例采用和go读取consul配置文件一致:go我这里采用https://github.com/nacos-group/nacos-sdk-go客户端, 直接上上代码:package mainimport ( "fmt" "log" "strings" "time" "github.com/nacos-group/nacos-sdk-go/clients" "gi...原创 2021-02-05 18:41:12 · 1610 阅读 · 0 评论 -
go任务调器gocron和xxl-job
常见的go调度器有GitHub - ouqiang/gocron: 定时任务管理系统和GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)gocron结构如下:xxxl-jon:go的 是实现:package main import ( "fmt" xxl "github.com/xxl-job/xxl-job-executor-go" "github...原创 2021-02-03 15:59:21 · 3163 阅读 · 0 评论