【golang】go语言编程常用规范/工具

代码格式化工具

代码风格:

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()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪的期许

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值