用 Go 开发终端接口服务--前言
从2006年 Go 语言诞生至今,在程序员眼里 Go 语言一直都是带着光环的,不仅仅是因为它出自于 Google 公司,更是因为发明它的人都是大神级别的人物,Rob Pike、Ken Thompson、Robert Griesemer 哪一个不是大名鼎鼎、如雷贯耳的!他们这些大牛们就是一个顶级品牌,发明了 C 语言,并使用 C 语言开发了 Unix 系统,定制了 UTF-8 编码标准 ... 阅读全文
用 Go 开发终端接口服务--小册介绍
小册介绍
大家好,我是潘军杰,很高兴大家进来看我写的小册,进来了就是有缘人,我们有共同的爱好,都是喜欢 Go 语言的同学,相聚在这里,希望大家可以一起成长和进步。
Go 是近几年开始流行的工程化系统语言,特别是微服务的盛行,很多同学开始从其他语言转向 Go,既系统学习了语法层面上的东西,又观摩了不少书籍上的示例代码,但真 ... 阅读全文
Go 通过身份证号获取生日年龄性别
我记得之前看到一个 Java 版本,通过身份证号获取出生日期,年龄和性别这些有用的信息,但一时记不起具体出处了,因为现在的项目都采用了 Go 开发,找了相关的库,竟然找不到,
现在想用 Go 实现一个,自己动手丰衣足食,身份证号的位数代表的含义,通过百度百科可以查到,这是关键点,不再累赘说明,代码里说吧
//中国居民身份证 工 ... 阅读全文
Go 常用 AES 加密解密代码
Go 中常用到 AES 对称加密解密算法,以下把关键代码分享出来:
// AES 加密 AES-128。key string 长度:16, 24, 32 bytes 对应 AES-128, AES-192, AES-256
func AesEncrypt(origData, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
blockMode : ... 阅读全文
Go bytes.Buffer 和 strings.Builder 性能比较
Go 语言里字符拼接是常用到的,而且只是进行少量的字符串拼接,这次专门根据这个场景进行做基准测试,具体代码如下,如果测试方法有什么欠妥的地方,还请读者提出来。本次测试力求测试的公平性。
测试目标方法代码:
/** strbyt.go
package src
import("bytes""fmt""strings")
func AppendWithAdd() {
var s string
for i: =0; i < ... 阅读全文
优雅地关闭 Go HTTP 服务
Go 1.8 之后,http.Server 增加了 Shutdown 函数,类似于第三方的 graceful 插件一样,可以平滑的关闭自身 HTTP 服务了,我们看看代码:
package main
import (
"context"
"github.com/urfave/negroni"
"log"
"net/http"
"os"
"os/signal"
"time"
)
func main(){
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.Response ... 阅读全文
Go 定时器 cron 表达式的使用
上次在《Go 定时器 cron 的使用》里说 cron 简单使用方法,如果想更灵活的使用定时,可能会涉及到更复杂的六位表达式的使用方法,如每半小时执行一次:
0 30 * * * *
六位的表达式看起来,有点费解,好比正则表达式一样,我们需要按步骤来理解;
理解六个作用域的意义
0 0 0 1 1 *
0 0 0 1 * *
0 0 0 * * 0
0 0 0 * * *
0 0 * * * *
... 阅读全文
Go 定时器 cron 的使用
cron 是 robfig 开发的一个定时作业库,robfig 总是想的比别人早,给了我们这些 Gopher 不少急需的东西,想当年 revel 的出现也是这样的。看看 cron 的使用,还是一如既往的简洁明了,发现 Go 的世界里,有些产品还是有鲜明的个人特质的,那就是所谓的个人魅力吧?!
总之 robfig 开发的产品都是有一定超前性,比较有理论基础,使用起 ... 阅读全文
Negroni 应用教程系列(二)
在介绍 Negroni 经典实例三大组件:日志 Logger,异常 Recovery,静态文件 Static 之前,需要说说它们采用的底层内幕,那就是中间件。Negroni 负责把一个个中间件链接起来,按照顺序逐一执行,形成一个中间件链。
Negroni 中间件实质是一个接口,名为 Handler,我们看看它的定义:
type Handler interface {
ServeHTTP(rw http.Respon ... 阅读全文
Negroni 应用教程系列(一)
创建一个 Web 服务器
Negroni 本身和 Go 语言哲学是一脉相承的,这是作者的初衷。我们看看怎么创建一个 Web 服务器。
新建一个 server.go 文件,代码如下:
package main
import (
"fmt"
"net/http"
"github.com/urfave/negroni"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *ht ... 阅读全文
Go 生成合法的 IP
利用 Go 语言,生成合法的 IP,代码如下:
package util
import (
"fmt"
"math/rand"
"time"
)
// 随机生成合法 IP,如: 222.16.123.95
func RandomIp() string {
// IP 范围二维数组
ranges := ipRange()
idx := newRand().Intn(10)
return numToIp(ranges[idx][0] + newRand().Intn(ranges[idx][1]-ranges[idx][0]))
}
// 随机生成 ... 阅读全文
Go 发起 HTTP 请求及获取相关参数
Go 要请求远程网页,可以使用net/http包中的client提供的方法实现。查看了官方网站有一些示例,没有太全面的例子,于是自己整理了一下。
Get 请求
Get 请求可以直接 http.Get 方法,非常简单。
func httpGet() {
resp, err := http.Get("http://www.01happy.com/demo/accept.php?id=1")
if err != nil {
// handle error
}
... 阅读全文
Go 查询数据库 Scan Null 字段报错解决办法
Go 语言基本类型都有默认值,比如整型,长整型,浮点型,字符串等等,都会有自己唯一的默认值 0,空字符串"",而不是nil, 这是它自身的特征,因为这个原因,Go 操作数据库,返回结果扫描填充结构体的时候,往往差强人意。当数据库字段是null值的时候,Goscan 数据填充结构体就出错了。
遇到这种情况,部分用户只能使用 sql.Null*** ... 阅读全文
Go 时间中文个性化处理
现在有些时间比较个性化,比如:5年前,11月前,20天前,23小时前,59分钟前,59秒前,刚刚... 等等,Go 语言可没有这些函数处理,我相信多数语言也不会内置处理此类的东西的,现在自己写个方法,首先要算出当前时间和给定的时间差,就是秒差,有了这个秒差,再进一步人工处理。废话少说,贴上代码吧(代码只是瞬间的思路和随手写法, ... 阅读全文
让 Go 代码自动加载
有时 Go 项目开发过程中,让新增、修改的代码智能编译重启,避免人为频繁 build 工作,是不错的事情。
然而 Go 是不会内置这些东西的,
目前 Go 领域,有哪些类似的库呢?我们可以使用第三方的库实现这种工作,但仅限于开发的阶段,正式服务环境,应该不是非常必要这么做。
第三方实现的类库有这两个,使用起来都很方便:
gin https:/ ... 阅读全文
Go 语言的一个配置文件解析器
Go 语言里找一个配置文件解析器,无意间发现了 https://github.com/robfig/config 这个库是 robfig 从 https://github.com/miguel-branco/goconfig 里分支修改过来的。看了下时间,已有一年多没动过了,估计库已相当完善,够用了。
在 github 里很多优秀的库或人,已经尘封了很长的时间,不知道什么原因,让人挺感慨的,毕竟前人花费 ... 阅读全文
Go 语言的包
包是函数和数据的集合。用 package 关键字定义一个包。文件名不需要与包名一致。包名的约定是使用小写字符。 Go 包可以由多个文件组成,但是使用相同的 package <name> 这一行。让我们在文件 even.go 中定义一个叫做 even 的包。
Listing 3.1. 一个小包
package even ← 开始自定义的包
func Even(i int) bool { ← 可导出函数
... 阅读全文
Go 语言的 os 包使用
本文摘自博客园的 yumuxu,原地址:
package main
import (
"fmt"
"io/ioutil"
"os"
"reflect"
"time"
)
func main() {
dir, _ := os.Getwd()
fmt.Println("dir:", dir)
err := os.Chdir("d:/project/test2")
dir, _ = os.Getwd()
fmt.Println("dir:", dir)
//参数不区分大小写
//不存在环境变量就返回空字符 ... 阅读全文
Go 的表单绑定器
Go 做 Web 开发,也算成熟了,平时后台开发,需要一款得心应手的表单绑定器,表单绑定器能快捷把表单数据填充业务实体类,免去 request 里一个个获取数据,赋值给实体类,省去了大量的时间和代码。
目前发现两个比较好用的表单绑定器:
binding:
https://github.com/mholt/binding
bind:
https://github.com/robfig/bind
自己常用的 ... 阅读全文
Go 用 Go 来开发后
Go 1.4 后开始计划自举,也就是Go 用 Go 开发和编译。很少听到一门语言这么做,感觉很新鲜。最初 Go 1.5 采用 Go 1.4 开发并编译出包,现在 Go 1.6 都准备出来了,回顾 2015 年 Go 发明者的自举做法,个人觉得非常成功。
为什么这么说呢,我发现 Go 1.5.2 的效能很不错,原先以为性能上估计会大打折扣的,结果自举后的版本和 C 开发的 ... 阅读全文