golang best practice(最佳实践)

fstMoon · · 3117 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

基本框架最佳实践及脚手架

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:

  1. define by interface
  2. add real implement or mock
  3. 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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:fstMoon

查看原文:golang best practice(最佳实践)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3117 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传