# Golang

# 资源

# 官网

# 国内镜像

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
1
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