代码格式化工具
代码风格:
go install github.com/fsgo/go_fmt/cmd/gorgeous@latest
gorgeous # 仅格式化git有改动的文件。如需格式化所有文件,可以执行 gorgeous ./...
标签格式:https://github.com/4meepo/tagalign
go install github.com/4meepo/tagalign/cmd/tagalign@latest
tagalign -fix -sort -order "json,default,validate" -strict ./...
项目环境配置
项目根目录新增文件go.env
GO111MODULE=on
GOPROXY=https://goproxy.cn,direct
为了使配置生效,需要执行命令:
export GOENV=${BASE_DIR}/go.env
常用命令:
go env # 打印go环境信息
go mod download || go mod download -x # 下载go依赖
go mod tidy # 自动整理go.mod依赖,移除未使用的依赖
结构体默认值与校验器
https://blog.csdn.net/winter2121/article/details/142633389
优雅格式日志
https://github.com/winterant/myslog
JSON序列化
json_util.go
func ToJSON(v any) []byte {
bf := bytes.NewBuffer([]byte{})
jsonEncoder := json.NewEncoder(bf)
jsonEncoder.SetEscapeHTML(false) // 防止<>&等html字符转义
_ = jsonEncoder.Encode(v)
return bf.Bytes()
}
func ToJSONIndent(v any, prefix, indent string) []byte {
data := ToJSON(v)
var out bytes.Buffer
_ = json.Indent(&out, data, prefix, indent)
return out.Bytes()
}
// JSONToObject 将传入的json字符串反序列化为结构体,兼容带转义字符的情况
func JSONToObject(jsonStr string, v any) (string, error) {
if v == nil {
return "", errors.New("the second arg must be a non-nil pointer")
}
// 尝试直接解析 JSON 字符串
err := json.Unmarshal([]byte(jsonStr), &v)
if err == nil {
return jsonStr, nil // 成功解析
}
// 如果解析失败,则尝试去除转义引号后再解析,尝试3次
for i := 1; i <= 3; i++ {
jsonStr, err = strconv.Unquote(jsonStr)
if err != nil {
return jsonStr, err // 尝试去除转义字符失败,直接认为字符串不合法!
}
err = json.Unmarshal([]byte(jsonStr), &v)
if err == nil {
return jsonStr, nil // 解析成功立即返回
}
}
return jsonStr, err // unmarshal失败
}
// JSONToObjectWithDefaultAndValidate 将传入的json字符串反序列化为结构体,并通过go-defaults库设置默认值、go-validator库校验参数
func JSONToObjectWithDefaultAndValidate[T any](jsonStr string, includeList bool) (*T, error) {
// 如果jsonStr含有list,则需要在setDefault之前先反序列一次,保证list元素存在
obj := new(T)
var err error
if includeList {
jsonStr, err = JSONToObject(jsonStr, obj)
if err != nil {
return nil, err
}
}
// 设置默认值
defaults.SetDefaults(obj)
// 反序列化
jsonStr, err = JSONToObject(jsonStr, obj)
if err != nil {
return nil, err
}
// 校验参数
validate := validator.New(validator.WithRequiredStructEnabled())
err = validate.Struct(obj)
if err != nil {
return nil, err
}
return obj, nil
}
func ToJSON(data any) string {
byteBuf := bytes.NewBuffer([]byte{})
encoder := json.NewEncoder(byteBuf)
encoder.SetEscapeHTML(false) // 不转义 特殊字符
err := encoder.Encode(data)
if err != nil {
return ""
}
return byteBuf.String()
}