go
文章平均质量分 69
Grassto
致力于用技术提高生活质量
展开
-
【开发掉坑】go 中 interface 的 nil 判断
今天介绍下 `go` 中的 `interface(any)` 的 `nil` 判断,项目中遇到的一个小问题,知识遗忘了,再做个记录。原创 2024-01-19 15:27:50 · 895 阅读 · 0 评论 -
go module 名称与 GitHub/Gitlab 地址不同时的引用方式(module declares its path as: github.com/someone/repo )
本篇介绍了go引用第三方库时,当module名称和引入仓库地址不同的情况下的解决方式:使用mod的replace特性。使用replace将替换成网站地址即可。module declares its path as: github.com/someone/repo but was required as: github.com/you/repo 的解决方式原创 2023-11-06 17:22:09 · 1680 阅读 · 0 评论 -
golang 发起 http 请求,获取访问域名的 ip 地址(net, httptrace)
本篇介绍了在go中如何获取访问域名的ip地址,通过go官方net包可获取。如果有记录http请求的域名ip这种需求,可以使用go 1.17后添加的httptrace包来插入钩子获取请求的ip地址。当然了,httptrace的作用不止于此,它可以搜集http客户端请求整个生命周期中的信息,本篇未做详细介绍,感兴趣的可自行探索。原创 2023-11-02 10:40:15 · 2069 阅读 · 0 评论 -
电子邮件发送接收原理(附 go 语言实现发送邮件)
本文阐述了电子邮件发送接收原理。大体流程:用户A-> 邮箱服务器 (-> 其他邮箱服务器) -> 用户B。最后介绍了下使用golang来发送邮件,配置好服务器后还是很方便的。原创 2023-10-25 18:42:10 · 859 阅读 · 0 评论 -
go 中的代码漏洞检查
govulncheck是go官方提供的一个二进制工具,用于检查go代码或二进制文件是否存在已知的安全漏洞。是go官方提供的一个漏洞检查工具。go团队从多处采集漏洞并存入自己的漏洞库,然后通过工具对代码或二进制文件进行漏洞扫描。很棒的一款工具,建议在日常的开发流程中(CI/CD,代码审查等)引入漏洞检查,能够帮助我们通过go来构建高质量、高安全性的程序。原创 2023-07-31 11:13:53 · 512 阅读 · 0 评论 -
web服务端接收多用户并发上传同一文件,保证文件副本只存在一份(附go语言实现)
本篇只是给个思路,抛砖引玉,介绍了如何实现客户端和服务器端的并发上传控制。通过示例代码,能够确保在并发上传时服务器中只存在一份文件副本。在实际的生产环境中,可能需要进一步优化和增强这些代码,以满足性能、安全性和可靠性方面的需求。原创 2023-07-05 11:15:51 · 739 阅读 · 1 评论 -
go 中的 ~int 类型是什么,怎么在类型前面还有一个波浪线?
本篇介绍泛型中一个小小的特性, 这种类型前添加波浪线的写法,表示的是衍生类型,即使用type自定义的类型也可以被识别到(type MyInt int),底层类型一致即可,主要同泛型一起使用。通常在使用这种需要排序的类型时,直接使用go官方提供的包即可。原创 2023-05-16 11:22:38 · 1526 阅读 · 2 评论 -
实时通信的服务器推送机制 EventSource(SSE) 简介,附 go 实现示例
是HTML5中一个强大的API,提供了简单可靠的服务器推送机制,用于实现实时通信。与WebSocket相比,的优势在于其简单易用、自动重连、轻量级和跨域支持。然而,它也有一些限制,如单向通信和较低的浏览器支持。相比之下,WebSocket适用于双向通信、大规模应用和实时性要求较高的场景,但其复杂性和穿越防火墙的挑战也需要考虑。总的来说,是一种非常有用的API,适用于许多实时应用场景,如实时股票报价、即时聊天、实时通知等。它提供了一种简单而可靠的方式来建立服务器推送连接,并实现实时更新和通知。原创 2023-05-07 15:18:17 · 12793 阅读 · 1 评论 -
go gin 框架设置 header 需要注意的一个坑
`go` 中使用 `c.Header("new-token", "123")` 设置 `http header` 键值的时候,设置的 `new-token` 键会变成 `New-Token` !!!原创 2023-03-23 17:23:45 · 2745 阅读 · 0 评论 -
前后端数据加密传输(附go语言实现)
这里做的加密传输,仅仅只能添加破解的复杂性,不能真的保证数据不泄露。所以一般的服务在做数据交互时也并不会刻意去做这种前后端的数据加密,一般性的是做服务器的session或者客户端的cookie校验,来保证数据不泄露,不被篡改。但你要是说我做session校验的token在前端泄露了,那这种也是用户自己的问题(进入黑客网站或其他做了鉴权),服务防不了这种,顶多是增加校验复杂性来让其更加繁琐。所以说在类似付款的操作的时候,都会再进行一次校验(输入密码/验证指纹等),来再做一次权限校验。原创 2023-03-12 14:22:24 · 3437 阅读 · 0 评论 -
go 调试器 delve(dlv) 的使用(附实例及常用命令解释)
delve工具非常强大,本篇介绍了其基础使用,希望在遇到问题的时候可以快速的进行问题排查,如果安装了GoLand,也可以使用Goland进行调试,相对来说更加的快捷,但遇到一些需要查看汇编代码或者其他高阶应用时,我还没发现GoLand如何使用,所以delve的命令使用最好也是要了解的,不会到时候一头雾水。原创 2023-02-03 15:20:26 · 7462 阅读 · 2 评论 -
go module 的本地仓库依赖解决方案(Multi-Module Workspaces)多 module 工作区模式 简介
go在1.18新推出的依赖本地。依赖本地未发布的module。设置了工作区后,所有的配置都会以工作区的配置为最高优先级。go.work文件不需要上传到git仓库,本地使用即可。go.work。原创 2023-01-17 11:26:37 · 1834 阅读 · 0 评论 -
go channel 基础(如何优雅地关闭 channel)
想必听说过 go 的,应该都知道 go 的最大的特性 goroutine 并发编程,而说到并发编程,使用 channel 进行数据传输是 go 中的必修课。go 的并发哲学:不要通过共享内存来通信,而要通过通信来实现内存共享。channel 的坑不少,本篇简单聊聊关闭 channel 的方法。原创 2023-01-12 10:35:29 · 2179 阅读 · 1 评论 -
go语言实现,用户登录:限制一分钟内密码错误的次数(固定时间窗口限流算法)
本文主要以一个业务来简单的描述了一下限流(固定时间窗口),并附带了一个go版本的实现。限流方式很多,还是要找到最适合本身业务的限流方式,难的不是实现,而是怎么去限流,怎么设计。原创 2022-10-13 17:59:29 · 1138 阅读 · 0 评论 -
go sync.Map Range 的同时进行 Store,Range 的遍历结果如何?(源码分析)
再详细解释一下开头提出的问题,RangeStore并发的时候,Range的遍历结果如何。Range先开始,并且没有发现dirty中有read为false),则遍历过程中是不能够获取到新添加进Map中的数据的,因为遍历的是之前的副本。Store先开始,Range遍历的时候会发现dirty中有read中不存在的数据,则会去和Store去竞争同一把锁,在Range竞争到锁的时候,会清空dirty同步read然后会拿着当前read的副本进入for去回调,即:遍历过程中可能会读取到Store的一部分的数据。原创 2022-09-29 11:52:06 · 1827 阅读 · 0 评论 -
go pprof 的使用
pprof是go中做性能分析的很强大的一个工具,支持内存,cpu,锁,goroutine等数据采集,本篇主要是做个简单介绍,真正进行分析的时候,需要耐心了解各种图,数据展示的含义,一般来说还是比较好理解的。原创 2022-09-23 14:26:13 · 673 阅读 · 0 评论 -
docker 的 limits 使用,控制内存,cpu等的最大占用率
最近遇到一个比较尴尬的问题,我有一个服务比较占用内存,做一些分析可能会让内存暴涨至十几个G,但是服务器的内存又比较小,只有4G,导致服务崩溃。最实在的做法就是服务器扩容,但是自己测试的服务,没必要这么奢侈,但又不想一直重启服务器,官网查找发现docker有个limits的属性可以使用,本篇以限制简述下其使用。......原创 2022-08-01 22:05:21 · 3227 阅读 · 0 评论 -
go 时间戳(秒、毫秒、纳秒)
注意点js得到的时间戳和go得到的时间戳是不一样的,js得到的是以毫秒为单位的,而go得到的是以秒或纳秒为单位的时间戳。js: var timestamp = new Date().getTime() console.log(timestamp) //1565084135229 毫秒go now:= time.Now() fmt.Println(now.Unix()) // 156......原创 2019-08-06 17:39:19 · 36643 阅读 · 3 评论 -
go 服务接入短信验证码功能(对接阿里云平台)
短信验证码还是比较常用的功能,已经有了很成熟的方案,本篇介绍的是对接阿里云的短信服务。原创 2022-07-01 20:10:31 · 1841 阅读 · 0 评论 -
go mod tidy 出错:create zip: module source tree too large (max size is 524288000 bytes)
最近做项目,用的公司内部的库,该库主要做一些分析,上传了一些分析源数据,导致代码仓库比较大,于是遇到了一个 很少遇见的问题:看错误返回,是说仓库太大了,已经超过 了。 还有这种限制?果然,删除代码仓库一些数据,将其缩小至 以内,问题解决。 的官方仓库也有人提了 的开源库中给出了答案:https://github.com/golang/mod/blob/89ce4c7ba8043b0e8a8c03f1a266fb0e56637314/zip/zip.go#L28-L30这里看到的确时 限制了。原创 2022-06-17 20:18:52 · 956 阅读 · 0 评论 -
go FTP 文件传输
FTP 简介FileZilla 工具go 实现 github.com/jlaffaye/ftp原创 2022-03-28 22:29:30 · 4300 阅读 · 6 评论 -
go 中的死锁检测,第三方工具 go-deadlock
前言最近提交了一份死锁代码,导致某个功能不可用,前端小哥纳闷反馈,这昨天还能用的,今天怎么就不行了?再一看原来是死锁了问题代码没有做自测,认为是很简单的修改,不会出 bug,大锅。git 提交后的 CI 没有做死锁的检查。官方是否提供了死锁检测呢?解决上网搜了一圈,发现官网没有死锁检测,接下来介绍今天的主角:go-deadlock,这是基于运行时的代码检测的。体现在代码中,就是用 deadlock 的同步原语来代替标准库 sync 的同步原语。先来看一个简单使用的例子:// 测试原创 2022-03-11 15:54:20 · 3336 阅读 · 1 评论 -
go ioutil.NopCloser 的使用
原理NopCloser 的原理很简单,就是将一个不带 Close 的 Reader 封装成 ReadCloser。以下是源码:// NopCloser returns a ReadCloser with a no-op Close method wrapping// the provided Reader r.func NopCloser(r Reader) ReadCloser { return nopCloser{r}}type nopCloser struct { Reader}原创 2022-03-09 17:46:01 · 5426 阅读 · 6 评论 -
go 随机数 rand 的简单使用,年会活动积分赛程设置,小组赛对战顺序
背景公司年会举办活动,我来组织乒乓球赛,由于人数不是很多而且时间比较紧迫。第一轮采用分组积分赛制,组内人人都会对战一次,程序实现了一下对战顺序。go 的随机数 randgo 的 math/rand 包实现了伪随机数生成器。如下示例,生成 10 以内的随机数 rand.Intn:func tMathRand() { for i := 0; i < 100; i++ { fmt.Println(rand.Intn(10)) }}不管运行几次,生成结果都如下:177918原创 2022-01-06 18:55:04 · 821 阅读 · 0 评论 -
前后端交互,密码加密,RSA 实现前端 js 加密,后端 go 解密
RSA 加密算法简介一种比较常见的非对称加密算法,常用于前后端交互中的密码加密,由于私钥是存放在服务端,外部正常情况下是拿不到解密密钥的。以下为百度百科的部分解释:RSA 公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥)PK 是公开信息,而解密密钥(即秘密密钥)SK 是需要保密的。加密算法E和解密算法 D 也都是公开的。虽然解密密钥SK是由公开密钥 PK 决定的,但却不能根据 PK 计算出 S原创 2021-12-21 18:58:03 · 3957 阅读 · 2 评论 -
go 时间戳转换需注意的坑,int64 -> float64
项目中遇到的一个小问题,做个记录:go 标准库 json.Unmarshal 当使用 interface{} 接收 int 类型的值时,会将其转换为 float64,这样也合理,本篇不深究 json 库的实现。当直接使用 interface{} 来接收参数时,是不会转换其类型的,如下:func tInterfaceTimestamp() { nowTimestamp := time.Now().Unix() fmt.Println("当前时间戳秒:", nowTimestamp) var i i原创 2021-11-11 16:33:08 · 3818 阅读 · 0 评论 -
go 内存对齐
什么是内存对齐内存对齐对程序员来说,一般是“透明的”,它属于编译器行为,编译器会将程序中的每个“数据单元”安排在适当的位置上。为什么要内存对齐CPU 读取数据的时候,不是一个字节一个字节读取的,而是一块一块读取的,具体的块的大小是根据 CPU 的位数来区分的。为了读取更快,减少 CPU 访问内存的次数(典型的空间换时间的做法),所以需要内存对齐。如何查看数据占用内存大小?func main() { // 64位 // bool 1 // int8 1 // int16 2原创 2021-11-09 17:54:32 · 584 阅读 · 0 评论 -
go 导出 html 报告(使用 hero 预编译 html 模板引擎)
前言项目需求,需要将服务器的数据进行导出,方便携带展示,做了一次 html 报告的导出,考虑如何实现。使用 vue 等前端框架,通过读取 js 文件来动态渲染 html 视图直接将数据写入 html 页面,多导出一些 html,通过 iframe 来进行页面的加载这里使用的是第二种方式。本篇主要介绍一下 go 的一个开源库 hero 预编译模板引擎,用于快速的渲染 html。常见的模板引擎一般有两种实现方式,一种是直接解析 HTML 语法树,然后根据一定的规则动态的拼接,另外一种是把模板预先原创 2021-10-27 18:55:25 · 1340 阅读 · 0 评论 -
go:embed 的使用
简介go:embed 是 go 1.16版本添加的新特性,可以在 go 生成的应用程序中嵌入静态文件(文件,文件夹)。部署的时候,直接扔一个二进制文件即可,不用再包含一些静态文件,考虑文件相对位置,因为它们已经被打包到生成的应用程序中了。导入 embed 的 go 源文件可以使用 //go:embed 指令在编译时从包目录或子目录中将读取的内容转换成 string, []byte, 或者 embed.FS 类型的变量。基本用法目录层级:下面用到的 hello.txt 的内容:hello wor原创 2021-10-09 13:20:06 · 5685 阅读 · 0 评论 -
go 实现 边导出边计算文件哈希值
导出文件,并计算哈希值(MD5, SHA1, SHA256),简单的封装了一下计算哈希值的 HashWriter。如下:package hashimport ( "crypto/md5" "crypto/sha1" "crypto/sha256" "fmt" "hash" "sync")//#region HashWriter 用 channel 做各哈希的计算type HashWriter struct { md5W hash.Hash md5Chan chan []原创 2021-09-29 13:17:07 · 663 阅读 · 0 评论 -
浅谈 CSRF 攻击(附实例,go 语言服务器)
先提一点,做实例的时候遇到的 cookie 带不上的原因,是谷歌提出的 SameSite Cookies 机制导致的,之前都不知道 cookie 还有这么个属性。趣事2011年12月21日,国内最大的开发者社区 CSDN 被黑客在互联网上公布了600万注册用户的数据。更糟糕的是,CSDN 在数据库中明文保存了用户的密码。当然了,这次事故的原理,肯定不是 CSRF。原理CSRF 是 Cross-Site Request Forgery 的缩写,跨站请求伪造。本篇阐述的是基于浏览器 cookie 机制原创 2021-09-23 18:18:56 · 772 阅读 · 0 评论 -
go 自定义 tag 的使用(外部服务的结构体数据转换,使用 tag 和 reflect 转成对应的 map)
背景最近做项目时,需要和外部服务进行数据交互,但是双方的数据结构不同(虽然表示的意思相近,例:本系统的 Name 对应其 UserName)。这时访问外部系统时,需要进行数据转换。第一版 直接转换直接提供方法,转成相应的结构,如下:type UserInfo struct { Name string Age int Height int}func (u *UserInfo) ToOutside() map[string]interface{} { res := make(ma原创 2021-09-09 16:57:55 · 2006 阅读 · 0 评论 -
go mod 引用出错问题排查(ambiguous import: found github.com/ugorji/go/codec in multiple modules)
问题最近遇到了一个很奇怪的问题,如下:diskimage/image imports fastdev/disk imports github.com/gin-gonic/gin imports github.com/gin-gonic/gin/binding imports github.com/ugorji/go/codec: ambiguous import: found package github.com/ugorji/go/cod原创 2021-09-03 11:28:58 · 7068 阅读 · 1 评论 -
go 中 iota 枚举的使用
iota 的基本规则示例原创 2021-08-26 13:22:27 · 402 阅读 · 0 评论 -
go http.Post 指定 body 单次读取的大小(32k?)
背景最近在做文件的上传,服务端直接通过请求的 body 获取文件数据。发现上传时的 io 性能并没有充分利用,大文件的上传,单次都是读取 32k ,希望能够手动调节单次读取的区块大小,以提升上传文件的速度。代码实现func Post(url, contentType string, body io.Reader) (resp *Response, err error) { return DefaultClient.Post(url, contentType, body)}简单看下 http.P原创 2021-08-18 13:50:17 · 2005 阅读 · 0 评论 -
go 中,json 转换时间(time.Time)的格式(默认格式为 RFC3339)
简介go 中使用 json.Unmarshal 转换结构体时,若结构体中有时间类型作为解析字段时,使用的是国际标准 RFC3339 (2006-01-02T15:04:05Z07:00) 格式来作为默认格式进行解析的。现前后端交互时间,有三种方式前端自行做 RFC3339 的时间格式转换后端自定义 MarshalJSON 和 UnmarshalJSON 方法前后端统一用时间戳进行交互(推荐这种方式)1. 前端的时间转换 RFC3339标准格式日期转为 RFC3339var toRFC3原创 2021-07-28 15:44:05 · 13556 阅读 · 0 评论 -
go gin框架做请求转发(代理 Proxy)
背景我现在有两个服务,简称 A 和 B。A 是对外开放的服务,存储了访问 B 所必须的参数,顾要通过 A 来做请求转发至 B。实现思路其实就是根据指定规则,拦截请求,替换一下请求的地址,期间可以自行对请求和返回结果做拦截,做一些修改值之类的操作。server 服务做中间件,进行拦截。(我这边是根据请求头中的内容来进行拦截的,判断 header 中的 direct 的值是否为 lab)替换请求的 Scheme(如:http) 和 Host (如:www.baidu.com)保证原请求的请求参数不原创 2021-07-23 18:17:34 · 11870 阅读 · 3 评论 -
go test 的使用(指定执行某个test, benchmark, testdata, cover, benchmem......)
简介有关测试的作用以及必要性,这篇文章就不多说了。go 语言中进行测试是很方便的,官方提供了比较完善的测试方式,使用 go test 命令和 testing 标准库。基础用法目录结构如下图源文件和测试文件放在同一目录下,测试文件以 _test 结尾,这个是固定格式,使用 go build 进行编译时,_test 文件不会编译。测试函数也有讲究:每个测试函数需要以 Test 为前缀,例如:Test_Division, TestDivision每个性能测试函数需要以 Benchmark 为前缀原创 2021-07-09 19:36:29 · 6808 阅读 · 0 评论 -
go xorm 使用,关于 AllCols() 方法更新不了数据的问题排查
问题在使用 xorm 的过程中,应该大多数人都遇到过更新方面的一些坑,如:在使用结构体映射做更新的时候,无法更新空值。此时,我们可以使用 AllCols 方法来进行强制更新。最近在使用该方法时,发现值并未进行更改,伪代码如下:var device model.Device // 需要入库的值engine.AllCols().Update(&device, &model.Device{Cid: device.Cid, Eid: device.Eid})需要根据 Cid 和 Eid原创 2021-06-03 16:35:34 · 1046 阅读 · 3 评论 -
go 相对路径 绝对路径 相互转换
简介本文主要做一个知识积累,在做项目的过程中,绝对路径转相对路径的时候,一下子有点懵了。本文的主角是 go 的官方库 path/filepath。判断是否为绝对路径func IsAbs(path string) (b bool)fmt.Println(filepath.IsAbs("master.exe")) // false绝对路径转相对路径func Rel(basepath, targpath string) (string, error)fmt.Println(filepath.Re原创 2021-05-20 15:32:30 · 4789 阅读 · 0 评论