0%

golang

golang 文档资料

golang books
gopl
go by example
learnxinyminutes
mastering go
go dev

golang data type

从底层而言,所有的数据都是由比特组成,但计算机一般操作的是固定大小的数,如整数、浮点数、比特数组、内存地址等。进一步将这些数组织在一起,就可表达更多的对象,例如数据包、像素点、诗歌,甚至其他任何对象。Go语言提供了丰富的数据组织形式,这依赖于Go语言内置的数据类型。这些内置的数据类型,兼顾了硬件的特性和表达复杂数据结构的便捷性。

Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。本章介绍基础类型,包括:数字、字符串和布尔型。复合数据类型——数组和结构体——是通过组合简单类型,来表达更加复杂的数据结构。引用类型包括指针、切片、字典、函数、通道,虽然数据种类很多,但它们都是对程序中一个变量或状态的间接引用。这意味着对任一引用类型数据的修改都会影响所有该引用的拷贝。

golang main pkg

main包里,使用go run main.go,编译器只会加载main.go这个文件,不会加载main包里的其他文件,只有非main包里的文件才会通过依赖去自动加载。所以需要输入多个文件作为参数。

1
$ go run main.go a.go b.go

golang pkg 第三方库

web框架

gin
echo
gofiber

数据库

gorm
ent

日志处理

logrus
zap

gin log response body
https://stackoverflow.com/questions/38501325/how-to-log-response-body-in-gin

git

go-git

gogs
gitea

权限

casbin

模板

fasttemplate

tui

survey
交互式命令行提示

bubbletea
tui framework

配置文件

viper

bot

joe
like hubot

压测工具

k6

golang 编码问题

Go里面内建仅支持UTF8字符串编码,因此如果你用fmt.Printf之类的函数无法将GBK,GB2312等编码随意转换打印。在 Golang 中转换 UTF-8 与 GBK 编码的文本,可以使用 Go 官方的 golang.org/x/text 包实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package main

import (
"bytes"
"fmt"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/encoding/traditionalchinese"
"golang.org/x/text/transform"
"io/ioutil"
)

//convert GBK to UTF-8
func DecodeGBK(s []byte) ([]byte, error) {
I := bytes.NewReader(s)
O := transform.NewReader(I, simplifiedchinese.GBK.NewDecoder())
d, e := ioutil.ReadAll(O)
if e != nil {
return nil, e
}
return d, nil
}

//convert UTF-8 to GBK
func EncodeGBK(s []byte) ([]byte, error) {
I := bytes.NewReader(s)
O := transform.NewReader(I, simplifiedchinese.GBK.NewEncoder())
d, e := ioutil.ReadAll(O)
if e != nil {
return nil, e
}
return d, nil
}

//convert BIG5 to UTF-8
func DecodeBig5(s []byte) ([]byte, error) {
I := bytes.NewReader(s)
O := transform.NewReader(I, traditionalchinese.Big5.NewDecoder())
d, e := ioutil.ReadAll(O)
if e != nil {
return nil, e
}
return d, nil
}

//convert UTF-8 to BIG5
func EncodeBig5(s []byte) ([]byte, error) {
I := bytes.NewReader(s)
O := transform.NewReader(I, traditionalchinese.Big5.NewEncoder())
d, e := ioutil.ReadAll(O)
if e != nil {
return nil, e
}
return d, nil
}

func main() {
utf8Byte := []byte("UTF-8字符串")
fmt.Println(string(utf8Byte))

// UTF-8 转 BIG5
s, _ := EncodeBig5(utf8Byte)
fmt.Println(string(s))

// BIG5 转 UTF-8
s, _ = DecodeBig5(s)
fmt.Println(string(s))

// UTF-8 转 GBK
s, _ = EncodeGBK(s)
fmt.Println(string(s))

// GBK 转 UTF-8
s, _ = DecodeGBK(s)
fmt.Println(string(s))
}

golang package init

每个 package 中每个 init () 函数都会被调用,且顺序固定

  • 对同一个 go 文件的 init () 调用顺序是从上到下的
  • 对同一个 package 中不同文件是按文件名字符串比较 “从小到大” 顺序调用各文件中的 init () 函数,对于
  • 对不同的 package,如果不相互依赖的话,按照 main 包中 “先 import 的后调用” 的顺序调用其包中的 init ()
  • 如果 package 存在依赖,则先调用最早被依赖的 package 中的 init ()