# Golang
# 资源
# 官网
# 国内镜像
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
1
2
2
- https://mirrors.aliyun.com/goproxy 阿里云
- https://goproxy.io 微软
- https://goproxy.cn 七牛云
- https://gocenter.io GoCenter
# 常用库
# 数据库相关
- gorm
go get -u github.com/go-gorm/gorm
1 - mysql
go get -u github.com/go-sql-driver/mysql
1 - postgres
go get github.com/lib/pq
1
# Golang work 对多模块的管理
Go 1.18引入的工作区模式,可以让你不用修改每个Go Module的go.mod,就能同时跨多个Go Module进行开发。
go work init
1
执行go work init后会生成一个go.work文件,go.work里列出了该workspace需要用到的Go Module所在的目录,workspace目录不需要包含你当前正在开发的Go Module代码。
如果要给workspace新增Go Module,可以使用如下命令:
go work use [-r] moddir
1
初始化项目
go mod init internal
1
# 使用zap 进能进行分副
package logger
import (
"fmt"
"os"
"path/filepath"
"runtime"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var logger *zap.Logger
func InitLogger() {
encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
core := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(zapcore.AddSync(&RotateFile{})), zap.NewAtomicLevelAt(zap.InfoLevel))
logger = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1), zap.AddStacktrace(zap.ErrorLevel))
}
type RotateFile struct {
fp *os.File
filename string
}
func (f *RotateFile) Write(p []byte) (n int, err error) {
if f.fp == nil {
f.rotate(time.Now())
}
if stat, _ := f.fp.Stat(); stat.Size() > 30*1024*1024 {
f.rotate(time.Now())
}
return f.fp.Write(p)
}
func (f *RotateFile) Sync() error {
return f.fp.Sync()
}
func (f *RotateFile) rotate(t time.Time) error {
if f.fp != nil {
f.fp.Close()
}
f.filename = fmt.Sprintf("logs/app_%s.log", t.Format("2006-01-02"))
fp, err := os.OpenFile(f.filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
return err
}
f.fp = fp
files, err := filepath.Glob("logs/app_*.log")
if err != nil {
return err
}
for _, file := range files {
info, err := os.Stat(file)
if err != nil {
continue
}
if time.Now().Sub(info.ModTime()) > 30*24*time.Hour {
os.Remove(file)
}
}
return nil
}
func callerEncoder(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(fmt.Sprintf("%s:%d", caller.File, caller.Line))
}
func timeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05"))
}
func InitLoggerWithConfig(c zap.Config) (*zap.Logger, error) {
var err error
logger, err = c.Build(zap.AddCaller(), zap.AddCallerSkip(1), zap.AddStacktrace(zap.ErrorLevel))
if err != nil {
return nil, err
}
return logger, nil
}
func Info(msg string, fields ...zap.Field) {
if logger != nil {
pc, file, line, ok := runtime.Caller(1)
if ok {
fields = append(fields, zap.String("caller", fmt.Sprintf("%s:%d", file, line)), zap.String("func", runtime.FuncForPC(pc).Name()))
}
logger.Info(msg, fields...)
}
}
func Error(msg string, fields ...zap.Field) {
if logger != nil {
pc, file, line, ok := runtime.Caller(1)
if ok {
fields = append(fields, zap.String("caller", fmt.Sprintf("%s:%d", file, line)), zap.String("func", runtime.FuncForPC(pc).Name()))
}
logger.Error(msg, fields...)
}
}
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100