涉及到金额类型,Golang没有自带的decimal类型,计算的时候会出现精度问题,所以需要引入decimal类型标识金额字段,下面是引入的步骤(项目上使用的是graphql):
1、golang 引入了第三方包 github.com/shopspring/decimal;
2、Graphql在生成代码的时候BigDecimal类型不能映射对应引入的decimal.Decimal类型,为了映射需要手段匹配一下,代码如下:
package bigdecimal import ( "fmt" "github.com/99designs/gqlgen/graphql" "github.com/shopspring/decimal" "io" ) // 写入类型 func MarshalMyDecimal(d decimal.Decimal) graphql.Marshaler { return graphql.WriterFunc(func(w io.Writer) { // TODO这点需要处理一下,现在是string类型,所以需要前端传递的金额数据是string的 io.WriteString(w, d.String()) }) } // 返回类型 func UnmarshalMyDecimal(v interface{}) (decimal.Decimal, error) { switch v := v.(type) { case string: return decimal.NewFromString(v) case decimal.Decimal: return v, nil case float64: return decimal.NewFromFloat(v), nil default: return decimal.Zero, fmt.Errorf("%T is not an Decimal", v) } }
3、在yml配置文件中配置model
models: BigDecimal: model: - dtc.platform.com/dtc-service-common/bigdecimal.MyDecimal
4、根据第3步手动映射后,定义金额字段类型为BigDecimal,生产代码的时候会自动映射为decimal.Decimal;
3、对应decimal类型使用的方法链接:decimal package - github.com/shopspring/decimal - Go Packageshttps://pkg.go.dev/github.com/shopspring/decimal#pkg-index