用 Go 开发终端接口服务--小册介绍
小册介绍
大家好,我是潘军杰,很高兴大家进来看我写的小册,进来了就是有缘人,我们有共同的爱好,都是喜欢 Go 语言的同学,相聚在这里,希望大家可以一起成长和进步。
Go 是近几年开始流行的工程化系统语言,特别是微服务的盛行,很多同学开始从其他语言转向 Go,既系统学习了语法层面上的东西,又观摩了不少书籍上的示例代码,但真 ... 阅读全文
Go 优雅的 SQL 语句拼接库
大部分时间都在使用数据库的业务操作,对我而言,这一部分的东西很重要,当初选择了很接近于 Go 原生 database/sql 的 sqlx 库,使用习惯了,感觉已经够用了。不过有些项目,让我很怀念 mybatis 这种介于 ORM 的组件库,有时候,我们需要优雅的拼接一个 SQL 语句,而不是使用多个字符串拼接来操作,因为对面特定的 sql 语法和 sqlx 的 ... 阅读全文
Go 通过身份证号获取生日年龄性别
我记得之前看到一个 Java 版本,通过身份证号获取出生日期,年龄和性别这些有用的信息,但一时记不起具体出处了,因为现在的项目都采用了 Go 开发,找了相关的库,竟然找不到,
现在想用 Go 实现一个,自己动手丰衣足食,身份证号的位数代表的含义,通过百度百科可以查到,这是关键点,不再累赘说明,代码里说吧
//中国居民身份证 工 ... 阅读全文
PostgreSQL 不依赖客户端常用的命令
/** 连接到数据库控制台 **/
/opt/PostgreSQL/10/psql -U postgres -d database_name -h 192.168.1.250 -p 5432
/** 输入密码后,进入控制台如下: **/
mytest=#
\h:查看SQL命令的解释,比如\h select。
\?:查看psql命令列表。
\l:列出所有数据库。
\c [database_name]:切换到其他数据库。
\d:列出当前数据库的所有表格。
\d [ta ... 阅读全文
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 : ... 阅读全文
解决烦人的 E: Sub-process /usr/bin/dpkg returned an error code (1)
服务器以前安装东西,不小心有些包安装失败了,造成包的依赖也被破坏了,后续再安装其他包的时候,你可能会遇到以下类似的错误:
Errors were encountered while processing:
openssh-server
ssh
exim4-base
exim4-daemon-light
exim4
E: Sub-process /usr/bin/dpkg returned an error code (1)
解决办法:
## 现将info文件夹更名
sud ... 阅读全文
Go bytes.Buffer 和 strings.Builder 性能比较
Go 语言里字符拼接是常用到的,而且只是进行少量的字符串拼接,这次专门根据这个场景进行做基准测试,具体代码如下,如果测试方法有什么欠妥的地方,还请读者提出来。本次测试力求测试的公平性。
测试目标方法代码:
/** strbyt.go
package src
import("bytes""fmt""strings")
func AppendWithAdd() {
var s string
for i: =0; i < ... 阅读全文
Java 的孤岛现象
Java 是会自动内存回收的,程序员可以通过 System.gc() 来发出内存回收的指令, Jvm 收到此类的指令后,会及时尽可能把用完的对象进行回收。
另外有一种不是很正式的概念,就是孤岛,多个对象相互关联起来,为成为一个“岛”对象,比如:
Dog dog1= new Dog(1);
Dog dog2 = new Dog(2);
Dog dog3 = new Dog(3);
dog1=dag2;
dog2=dag3; ... 阅读全文
配置编译 Nginx 让网站用上 HTTP2
HTTP2 出来有一阵子了,一直想把公司的项目用上 HTTP2,了解了一下技术要求。首先 HTTP2 似乎需要到 SSL 证书,腾讯云和阿里云都有免费试用一年的 SSL 证书,腾讯云的证书用满一年后,还可以重新免费申请续用,至少目前还是这样的。
使用 HTTP2 只要搞定 Web 服务器,比如 Apached 和 Nginx,其他的后端程序不用做任何改动。当然前提 ... 阅读全文
在 Ubuntu 上搭建单机版 Redis
为什么用到 Redis?
最近开发一个类似抢拍的拍卖 App;有个环节是需要秒刷新的,而且多少个商品同时需求秒请求订单数据,这时想想长期以往 MySQL 肯定应付不了, 所以采用了内存数据库的方案,当然就先到 Redis 了;其实 memcached 也是比较好的选择,但后期的数据结构需保留一定的灵活性,所以选择了 Redis。终端请求的数据,生命周 ... 阅读全文
优雅地关闭 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 ... 阅读全文
Ubuntu 以 APT 方式安装最新的 MySQL
记得上次写了 《
Ubuntu 14.04 安装 64位的 MySQL 5.7.9
》的文章,发现对于一般用户,操作起来还是繁琐,主要是多个包互相的依赖关系造成的,有些人问能不能使用 Ubuntu apt-get install 来安装最新的 MySQL?答案是可以的。
甲骨文官方提供了这种方案,不仔细看,还真不好发现,下面说说步骤:
1: 先到 MySQL 官网上,找到 APT 包 ... 阅读全文
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
}
... 阅读全文
MyBatis 自定义通用 Mapper
Mybatis 提供自动生成 Mapper 的工具,看看生成的 Mapper,不是尽如人意,比如多表关联和返回的数据类型和传入参类型上。一直想写一个通用的 Mapper,传参类型是 Map,返回 Map 类型;大体分两种数据库操作 DDL 和 DML 操作,而且 DML 分别提供获取一条记录和多条,插入一条记录,批量插入记录,更新,删除一条记录。其中 DDL 是参考 ... 阅读全文
JFinal 使用 HikariCP 数据库连接池
看了HikariCP 的源码,比较感兴趣,想在 JFinal 中集成这样的数据库连接池,发现并没有支持的插件,于是自己动手尝试写了 JFinal HikariCPPlugin
插件
,得益于 JFinal 这么简洁的架构,几分钟时间就测试出炉了,肉眼测试,不严谨,如果有什么不妥的地方,希望网友补充斧正吧!
直接上代码,是程序员最喜欢干的事情:
package com.jfi ... 阅读全文