分享
  1. 首页
  2. 文章

golang best practice(最佳实践)

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

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

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏