go code 锦集

阅读: 评论:0

go code 锦集

go code 锦集

code

好的代码忍不住想记2笔。重点拿来即用

  1. 服务管理。服务启动按此套路来,初始化,启动,停止的轮廓感特强,借鉴nsqd。
package mainimport ("github/judwhite/go-svc/svc""github/rs/zerolog/log""sync"
)type program struct {once sync.Once
}
//服务未开始需要准备的工作
func (p *program) Init(env svc.Environment) error {return nil
}//服务启动的业务代码入口
func (p *program) Start() error {return nil
}//当你的服务进程被kill pid 的时候会触动Stop方法执行,stop执行完毕进程退出(当然kill -9 pid是不行的)
func (p *program) Stop() error {//once是避免多次kill发送过来停止信号p.once.Do(func() {})return nil
}func main() {prg := &program{}if err := svc.Run(prg); err != nil {}
}
  1. 并发型却相互依赖goroutinu。任意一个协程error了,外围便知,亮点的code结构上干净利落的解耦,却又能轻易做到紧密通讯。nsqd使用此设计 控制http,tcp,https等服务启动到停止的生命周期。
package mainimport ("sync"
)type WaitGroupWrapper struct {sync.WaitGroup
}func (w *WaitGroupWrapper) Wrap(cb func()) {w.Add(1)go func() {cb()w.Done()}()
}func main(){w := WaitGroupWrapper{}exitCh := make(chan error)var once sync.OnceexitFunc := func(err error) {once.Do(func() {if err != nil {fmt.Println("自定义打印日志")}exitCh <- err})}//TCPServer,TCPServer(),HttpServer() 假装是一个个协程相互独立并行却同时正常才行的协程// 当然TCPServer,HttpServer需要保证 能被通讯到w.waitGroup.Wrap(func() {exitFunc(TCPServer())})w.waitGroup.Wrap(func() {exitFunc(HttpServer())})err := <-exitChfmt.Println("err到说明存在服务err了,在此开始你的err错误处理逻辑,保证业务代码从上而下顺流而下")return
}
  1. 协程编排。让你能轻松设计出系列串行goroutinue,和并行goroutinue,其表现规则在代码结构层也清晰易懂,有异常捕获。

package mainimport ("errors""fmt""runtime""sync"
)func try(fn func(), cleaner func()) (err error) {if cleaner != nil {defer cleaner()}defer func() {_, file, line, _ := runtime.Caller(2)if rErr := recover(); rErr != nil {if _, ok := rErr.(error); ok {err = errors.New(fmt.Sprintf("%s:%d,err:%v", file, line,rErr.(error)))} else {err = fmt.Errorf("%+v", rErr)}}}()fn()return nil
}// Parallel 并发执行
func Parallel(fns ...func()) func() {var wg sync.WaitGroupreturn func() {wg.Add(len(fns))for _, fn := range fns {go try(fn, wg.Done)}wg.Wait()}
}// Serial 串行
func Serial(fns ...func()) func() {return func() {for _, fn := range fns {fn()}}
}func main() {serial1 := func() {fmt.Println("我是串行协程1")}parallels := Parallel(func(){fmt.Println("我是并行协程1,我得等到 serial1 里面的串行协程执行完毕后才能执行")},func(){fmt.Println("我是并行协程2,我得等到 serial1 里面的串行协程执行完毕后才能执行")},)serial4 := func() {fmt.Println("我是串行协程4,我得等到 Parallel 里面的2并发协程都执行完毕才能开始")}run :=Serial(serial1,parallels,serial4)//开跑run()
}

本文发布于:2024-02-04 20:08:23,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170715495059195.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:code   锦集
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23