Go学习笔记(十)老项目迁移 go module 大型灾难记录
最近在改造一个比较早期的一个项目,其中就涉及到用将原来 Vendor 管理依赖换成 Go Modules 来管理。 然而过程真是一波三折,在这里总结一下此次 Go Modules 改造中遇到的问题,以及解决方法。 ...
最近在改造一个比较早期的一个项目,其中就涉及到用将原来 Vendor 管理依赖换成 Go Modules 来管理。 然而过程真是一波三折,在这里总结一下此次 Go Modules 改造中遇到的问题,以及解决方法。 ...
前段时间买了个 Inter NUC (NUC10i5FNH6), 主要用来在家里搬砖。体验了一段时间 win10, 虽然配置了 WSL2, 但开发体验实在糟糕,在考虑过 Ubuntu 和黑苹果后,还是选择了 Ubuntu, 毕竟用习惯了白苹果,突然用个黑苹果,不能随意升级,还有接一个 USB WiFi ,还担心驱动问题。。。 NUC 用了一段时间,还是有点卡,CPU跟不上。 最后还是组装了一台台式主机,将原来的系统盘查上去直接就可使用,爽到飞起。 至于NUC就当服务器用了。 毕竟头一次想把 Ubuntu 当作生产力,记录一下折腾过程。 ...
全文基于GO 1.14 计时器在定时执行一些任务时很有用。Go内部依靠调度器来管理创建的计时器。而Go的调度程序是协作式的调度方式,这会让整个调度看起来比较复杂,因为goroutune必须自己停止(依赖channel阻塞或system call), 或者由调度器自己在某个调度点暂停。 ...
在团队协作时,由于个人编码习惯的差异,导致代码格式,风格都会有所不同,这就给代码审核带来一定的困难,更严重的是会导致整体的代码质量不可控。这时,我们有必要借助一些工具来约束我们的代码格式。在Go中,我们经常使用的工具有: goimports: 自动导包; gofmt : 格式化我们的代码; golint: 检查代码命名,注释等; go vet: 静态错误检查。 那么,我们可以利用这些工具来规范团队的代码风格。但如果每次手动执行这些命令,或者仅仅依靠IDE去检查,这是不靠谱的,因为人的行为本身是不靠谱的==。 于是,我们可以结合git hook, 强制执行这些检查,检查不通过,代码都无法提交,从而达到强一致性。 同时,结合上一篇«规范git commit message与自动化版本控制», 这里我们介绍一下利用pre-commit 约束commit-msg来约束我们的代码与git commit message。 ...
RESRful API已经流行很多年了,我也一直在使用它。最佳实践也看过不少,但当一个项目完成,再次回顾/梳理项目时,会发现很多API和规范还是多少有些出入。在这篇文章中,我们结合Go Web再次梳理一下RESTful API的相关最佳实践。 ...
用Go去调用一些外部的命令其实很愉快的,这遍文章就总结一下我自己日常用的比较多的几种方法。 关于Unix标准输入输出 在具体聊os/exec的使用前,了解一下shell的标准输出是很有必要的。 我们平常会用到或看到这样的命令: $ ls xxx 1>out.txt 2>&1 $ nohup xxx 2>&1 & 你知道这里1,2含义么? 其实这里的1,2指的就是Unix文件描述符。文件描述符其实就一数字,每一个文件描述符代表的都是一个文件。如果你打开100个文件,你就会获取到100个文件描述符。 这里需要注意的一点就是,在Unix中一切皆文件。当然,这里我们不必去深究,我们需要知道的是1,2代表的是标准输出stdout与标准错误输出stderr。还有0代表标准输入stdin。 在os/exec中就用到了Stdin,Stdout,Stderr,这些基本Unix知识或能帮助我们更好理解这些参数。 os/exec os/exec包内容并不多,我们大概过一下。 LookPath(file string) (string, error) 寻找可执行文件路径,如果你指定的可执行文件在$PATH中,就会返回这个可执行文件的相对/绝对路径;如果你指定的是一个文件路径,他就是去判断文件是否可读取/执行,返回的是一样的路径。 在我们需要使用一些外部命令/可执行文件的时候,我们可以先使用该函数判断一下该命令/可执行文件是否有效。 Command(name string, arg …string) *Cmd 使用你输入的参数,返回Cmd指针,可用于执行Cmd的方法。 这里name就是我们的命令/可执行文件,后面的参数可以一个一个输入。 CommandContext(ctx context.Context, name string, arg …string) *Cmd 和上面功能一样,不过我们可以用上下文做一些超时等控制。 之后几个就是Cmd的一些方法。 (c *Cmd) CombinedOutput() ([]byte, error) 将标准输出,错误输出一起返回; (c *Cmd) Output() ([]byte, error) 输出标准输出,错误从error返回; (c *Cmd) Run() error 执行任务,等待执行完成; (c *Cmd) Start() error, (c *Cmd) Wait() error 前者执行任务,不等待完成,用后者等待,并释放资源; (c *Cmd) StderrPipe() (io....
有时候为了更好的兼容Windows, 或者我们为了获得更高级别功能的访问权限(如配置或创建JobObjects或安全令牌等),我们需要直接去调用Windows的系统API。 很幸运,我们可以利用syscall包与系统直接通信,不用用到CGO 。 然而,也有不方便的地方,如大多数的API,我们需要依赖不安全 (unsafe)的内存管理。 这篇文章,主要记录了我在平时开发过程中以及网上收集到的一些关于Windows API调用相关的知识,或者开发模式,方便你遇到类似的情况后,能更快入手。 ...
OAuth 2.0是一个关于授权的开放网络标准,主要致力于简化客户端人员开发,同时为Web应用程序、桌面应用程序、移动电话和物联网设备提供特定的授权规范。他的官网在这里。在RFC6749中有明确协议规范。 简单来说,我们平时使用的很多第三方登录并获取头像等信息就是用的OAuth 2.0。如我们用QQ登录一些论坛,用google账号登陆facebook,用github账号登陆gitlab等。如下图展示的就是利用QQ登录网易云音乐Web版,其中用到的就是OAuth 2.0。 ...
相信很多程序猿和我一样不喜欢写API文档。写代码多舒服,写文档不仅要花费大量的时间,有时候还不能做到面面具全。但API文档是必不可少的,相信其重要性就不用我说了,一份含糊的文档甚至能让前后端人员打起来。 而今天这篇博客介绍的swaggo就是让你只需要专注于代码就可以生成完美API文档的工具。废话说的有点多,我们直接看文章。 ...
在Coding的时候,难免会有一些重复的代码或者形式相似的代码,在写这些代码的时候,你会觉得索然无味,甚至有点讨厌。这时候,你就会想,这段代码是否可以抽象成一个通用的片段,我简单敲几个快捷键就出来了呢。这也就代码片段所解决的问题。 ...