轨道 · 写下来的字

golang

2020.01.14

目录
  1. golang 文档资料
  2. golang data type
  3. golang main pkg
  4. golang pkg 第三方库
  5. golang 编码问题
  6. golang package init

golang 文档资料

golang books gopl go by example learnxinyminutes mastering go go dev

golang data type

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

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

Golang data types

Golang numeric types

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

模板

fasttemplate

tui

survey 交互式命令行提示

Go 开发者调查结果

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 包实现

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 ()
← 回到文章