业务开发
首先是业务开发,主要包含了 web
、数据库、Redis
等。
Gin ⭐️⭐️⭐️⭐️⭐️
首先是 Gin,一款 HTTP 框架,使用简单、性能优秀、资料众多;你还在犹豫选择哪款框架时,那就选择它吧,基本没错。
当然和它配套的 github.com/swaggo/gin-… swagger 工具也是刚需;利用它可以生成 swagger 文档。
GORM ⭐️⭐️⭐️⭐️⭐️
GORM 也没啥好说的,如果你喜欢 orm
的方式操作数据库,那就选它吧;同样的也是使用简单、资料较多。
如果有读写分离需求,也可以使用 GORM
官方提供的插件 github.com/go-gorm/dbr… ,配合 GORM
使用也是非常简单。
errors ⭐️⭐️⭐️⭐️⭐️
Go 语言自身提供的错误处理比较简单,github.com/pkg/errors 提供了更强大的功能,比如:
- 包装异常
- 包装堆栈等。
常用的有以下 API:
// WithMessagef annotates err with the format specifier. func WithMessagef(err error, format string, args ...interface{}) error // WithStack annotates err with a stack trace at the point WithStack was called. func WithStack(err error) error
zorolog ⭐️⭐️⭐️⭐️⭐️
Go 里的日志打印库非常多,日志在日常开发中最好就是存在感低;也就是说性能强(不能影响到业务代码)、使用 API 简单。
"github.com/rs/zerolog/log" log.Debug().Msgf("OrderID :%s", "12121")
excelize
github.com/qax-os/exce…是一个读写 Excel 的库,基本上你能遇到的 Excel 操作它都能实现。
now ⭐️⭐️⭐️⭐️
github.com/jinzhu/now 是一个时间工具库:
- 获取当前的年月日、时分秒。
- 不同时区支持。
- 最后一周、最后一个月等。
import "github.com/jinzhu/now" time.Now() // 2013-11-18 17:51:49.123456789 Mon now.BeginningOfMinute() // 2013-11-18 17:51:00 Mon now.BeginningOfHour() // 2013-11-18 17:00:00 Mon now.BeginningOfDay() // 2013-11-18 00:00:00 Mon now.BeginningOfWeek() // 2013-11-17 00:00:00 Sun now.BeginningOfMonth() // 2013-11-01 00:00:00 Fri now.BeginningOfQuarter() // 2013-10-01 00:00:00 Tue now.BeginningOfYear() // 2013-01-01 00:00:00 Tue now.EndOfMinute() // 2013-11-18 17:51:59.999999999 Mon now.EndOfHour() // 2013-11-18 17:59:59.999999999 Mon now.EndOfDay() // 2013-11-18 23:59:59.999999999 Mon now.EndOfWeek() // 2013-11-23 23:59:59.999999999 Sat now.EndOfMonth() // 2013-11-30 23:59:59.999999999 Sat now.EndOfQuarter() // 2013-12-31 23:59:59.999999999 Tue now.EndOfYear() // 2013-12-31 23:59:59.999999999 Tue now.WeekStartDay = time.Monday // Set Monday as first day, default is Sunday now.EndOfWeek() // 2013-11-24 23:59:59.999999999 Sun
Decimal ⭐️⭐️⭐️⭐️
当业务上需要精度计算时 github.com/shopspring/… 可以帮忙。
import ( "fmt" "github.com/shopspring/decimal" ) func main() { price, err := decimal.NewFromString("136.02") quantity := decimal.NewFromInt(3) fee, _ := decimal.NewFromString(".035") taxRate, _ := decimal.NewFromString(".08875") subtotal := price.Mul(quantity) preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1))) total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1))) fmt.Println("Subtotal:", subtotal) // Subtotal: 408.06 fmt.Println("Pre-tax:", preTax) // Pre-tax: 422.3421 fmt.Println("Taxes:", total.Sub(preTax)) // Taxes: 37.482861375 fmt.Println("Total:", total) // Total: 459.824961375 fmt.Println("Tax rate:", total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875 }
基本上你能想到的精度转换它都能做到;配合上 GORM
也可以将 model
字段声明为 decimal
的类型,数据库对应的也是 decimal
,这样使用起来时会更方便。
Amount decimal.Decimal `gorm:"column:amout;default:0.0000;NOT NULL" json:"amout"`