基本框架最佳实践及脚手架
library选择(not why A not B problem, only just need one problem,familiar)
logger: zap
web framework: gin
orm: xorm
ioc framework: fx,支持开发模块化
ACL: casbin
kv: boltdb
process local cache with: go-cache,
模块化
component:
- define by interface
- add real implement or mock
- inject interface by ioc framework (go.uber.org/fx)
use cache as and example
cache: define by interface
// Cache Cache
type Cache interface {
Put(prefix, key string, value interface{})
Get(prefix, key string) (interface{}, bool)
}
// Module Module
var Module = fx.Options(
fx.Provide(NewCache))
then inject into container by
app := fx.New(logger.Module, database.Module, cache.Module, config.Module,
dao.Module, handler.ModuleWithDep, router.Module, fx.Populate(&errC))
// test demo
app := fx.New(logger.Module, database.Module, config.Module, fx.Options(handler.ModuleWoDep, **user.TestModule**), router.Module, fx.Populate(&errC))
ioc to get it by constructor
// NewHandler NewHandler
func NewHandler(user user.Service, cache cache.Cache) *Handler {
return &Handler{
userSvc: user,
cache: cache,
}
}
模块目录结构
├── project
│ ├── ReadMe.md
│ ├── cmd
│ │ ├── client
│ │ ├── cmd
│ │ └── main.go
│ ├── common
│ │ ├── cache
│ │ │ └── cache.go
│ │ ├── config
│ │ │ ├── cmd_flags.go
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── define.go
│ │ │ └── test_data
│ │ │ ├── paas.yaml
│ │ │ └── paas_dev.yaml
│ │ ├── const.go
│ │ ├── database
│ │ │ └── db.go
│ │ ├── errors
│ │ │ └── error.go
│ │ └── logger
│ │ └── logger.go
│ ├── config
│ │ ├── ReadMe.md
│ │ ├── config.yaml
│ │ └── config_dev.yaml
│ ├── dao
│ │ ├── convert
│ │ │ └── ReadMe.md
│ │ ├── export.go
│ │ ├── generate.sh
│ │ ├── internal
│ │ ├── models
│ │ ├── templates
│ │ │ ├── go
│ │ │ │ ├── config
│ │ │ │ └── struct.go.tpl
│ │ │ ├── gomeddler
│ │ │ │ ├── config
│ │ │ │ └── struct.go.tpl
│ │ │ └── goxorm
│ │ │ ├── config
│ │ │ └── struct.go.tpl
│ │ └── user
│ │ ├── dao.go
│ │ └── export.go
│ ├── doc
│ │ └── ReadMe.md
│ ├── go.mod
│ ├── go.sum
│ ├── handler
│ │ ├── export.go
│ │ ├── helper
│ │ │ └── common.go
│ │ ├── test
│ │ │ └── test.go
│ │ └── user
│ ├── module
│ │ ├── ReadMe.md
│ │ ├── base
│ │ │ ├── helper.go
│ │ │ └── service.go
│ │ ├── pam
│ │ └── user
│ │ ├── definition
│ │ │ └── service.go
│ │ ├── export.go
│ │ ├── impl
│ │ │ └── user_impl.go
│ │ └── mock
│ │ └── user_mock.go
│ └── router
│ ├── middleware
│ │ ├── logger.go
│ │ └── request_id.go
│ └── router.go
├── test
│ ├── ReadMe.md
│ ├── go.mod
│ └── simple_test.go
└── util
├── collection
│ └── string.go
└── go.mod
related library
require (
cloud.google.com/go v0.34.0 // indirect
github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7 // indirect
github.com/gin-gonic/gin v1.3.0
github.com/go-sql-driver/mysql v1.4.0
github.com/go-xorm/cmd/xorm v0.0.0-20181109005937-173b5248cedf // indirect
github.com/go-xorm/xorm v0.7.1
github.com/golang/protobuf v1.2.0 // indirect
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 // indirect
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 // indirect
github.com/lib/pq v1.0.0
github.com/mattn/go-isatty v0.0.4 // indirect
github.com/mitchellh/mapstructure v1.1.2
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/spf13/pflag v1.0.3
github.com/spf13/viper v1.3.1
go.uber.org/atomic v1.3.2 // indirect
go.uber.org/dig v1.6.0 // indirect
go.uber.org/fx v1.8.0
go.uber.org/multierr v1.1.0 // indirect
go.uber.org/zap v1.9.1
golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 // indirect
gopkg.in/go-playground/validator.v8 v8.18.2 // indirect
gopkg.in/yaml.v2 v2.2.2
)
reference
模块化组织 https://zhuanlan.zhihu.com/p/39326315
日志 https://medium.com/@gosamv/using-gos-context-library-for-logging-4a8feea26690
有疑问加站长微信联系(非本文作者)