golang-有用的代码片段

好久没有写文章了呢~
一旦忙于做其他的事或者懒下来,就不想做别的了。
新冠肺炎造成的社会停摆终于结束了。
今年也要加油!!

判断文件或文件夹是否存在

1
2
3
4
5
if _fileInfo_,err:=os.Stat("path/to/file");os.IsNotExist(err){
// file not exist
} else {
// file exist
}

日期的格式化

也许Go语言的开发者肯·汤普逊Ken Thompson比较自恋,所以格式化时间日期时使用的layout字符串也奇葩。
01/02 15:04:05PM 2006 -0700MM/DD HH:mm:SS'PM YYYY 'MST相比,记忆难度差不多。(MST是指北美山区时区标准时间)

参考:golang/Format a time or date [complete guide]

1
2
3
4
5
6
7
8
9
10
const (
layoutISO = "2006-01-02"
layoutUS = "January 2, 2006"
layoutCHINA="2006-01-02 15:04:05" // 年-月-日 时:分:秒 YYYY-MM-DD HH:mm:SS
)
date := "1999-12-31"
t, _ := time.Parse(layoutISO, date)
fmt.Println(t) // 1999-12-31 00:00:00 +0000 UTC
fmt.Println(t.Format(layoutUS)) // December 31, 1999
fmt.Println(t.Format(layoutCHINA)) // 1999-12-31 00:00:00

函数time.Parse解析一个日期字符串;time.Time类型的值可以用Format函数格式化成字符串。

两个函数的签名分别是:

1
func Parse(layout, value string)(Time,error)
1
func (t Time) Format(layout string)string

预定义的layout,例如:time.RFC3339

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ANSIC       = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700"
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700"
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"

想格式化成自定义格式时使用以下数字、字符进行组合作为layout参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
类型      可选
--------------
年 06 2006
月 01 1 Jan January
日 02 2 _2(宽度2,右对齐)
星期 Mon Monday
-----------------------------
时 03 3 15
分 04 4
秒 05 5
毫秒 .000 .999(后者会移除尾部的零)
微妙 .000000 .999999(后者会移除尾部的零)
纳秒 .000000000 .999999999(后者会移除尾部的零)
-------------------------------------------------------
上午下午 PM pm
时区 MST
时差 -0700 -07 -07:00 Z0700 Z07:00

获取文件修改时间

1
2
fileInfo,_:=os.Stat("path/to/file")
file.ModTime() //文件修改时间

NET/HTTP

跳过HTTPS证书检查

1
2
3
4
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport:tr}

华为物联网平台的证书居然不匹配,说的是这个:https://iotda.cn-north-4.myhuaweicloud.com/。于是测试时出现“Post https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/{project_id}/subscriptions: x509: certificate is valid for *.apigw.cn-north-4.huaweicloud.com, not iotda.cn-north-4.myhuaweicloud.com”的错误


HTTP路由

Go自带的ServeMux路由的能力太薄弱,所以换用第三方开发的吧
更多规则和用法参考:https://github.com/gorilla/mux

1
go get -u github.com/gorilla/mux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func main() {
r := mux.NewRouter()
r.HandleFunc("/", HomeHandler)
r.HandleFunc("/products", ProductsHandler)
r.HandleFunc("/articles", ArticlesHandler)
// http.Handle("/", r)

// r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler)
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
http.Handle("/", r)

//http.ListenAndServe(...)
}

func ArticlesCategoryHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "Category: %v\n", vars["category"])
}

使用MySQL数据库

首先在项目中安装驱动https://github.com/go-sql-driver/mysql

1
go get -u github.com/go-sql-driver/mysql

然后在需要使用MySQL数据库的文件中导入

1
2
3
4
import "database/sql"
import _ "github.com/go-sql-driver/mysql"

db, err := sql.Open("mysql", "user:password@/dbname")