轨道 · 写下来的字
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包里的文件才会通过依赖去自动加载。所以需要输入多个文件作为参数。
$ 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
模板
tui
survey 交互式命令行提示

bubbletea tui framework
配置文件
bot
joe like hubot
压测工具
golang 编码问题
Go里面内建仅支持UTF8字符串编码,因此如果你用fmt.Printf之类的函数无法将GBK,GB2312等编码随意转换打印。在 Golang 中转换 UTF-8 与 GBK 编码的文本,可以使用 Go 官方的 golang.org/x/text 包实现
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 ()