加载顺序

go语言标准规定了多个编译单元的初始化顺序,包的初始化顺序按照包引入的顺序进行初始化,如果有依赖关系先解决依赖关系,按依赖的顺序进行初始化。
-
如果某个包被多次导入的话,也只会初始化一次。
-
对于同一个包中的多个 .go 文件,实现一般按照文件名排序,进行初始化
-
首先按顺序初始化全局常量和变量,如果有依赖关系先解决依赖关系,按依赖的顺序进行初始化
-
再调用 init 函数进行初始化
并且go语言是不允许包循环引用的,也不允许全局常量变量循环引用。
总结来说,不用担心全局变量之间的初始化顺序了。
gin
router := gin.Default()
//静态资源映射
router.StaticFile("/favicon.ico", "./resources/favicon.ico/gomod.html")
// 导入所有模板,多级目录结构需要这样写
router.LoadHTMLGlob("./resources/favicon.ico/*")
// website分组
v := router.Group("/")
{
v.GET("/index.html", IndexHandler)
}
router.GET("/", func(c *gin.Context) {
time.Sleep(5 * time.Second)
c.String(http.StatusOK, "Welcome Gin Server")
})
//router.Run(":8080")
srv := &http.Server{
Addr: ":8080",
Handler: router,
}
go func() {
// service connections
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
// Wait for interrupt signal to gracefully shutdown the server with
// a timeout of 5 seconds.
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
log.Println("Shutdown Server ...")
ctx, cancel := context.WithTimeout(context.Background(), 5* time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
}
log.Println("Server exiting")
//模板映射功能
func IndexHandler(c *gin.Context) {
time.Sleep(21 * time.Second)
c.HTML(http.StatusOK, "index.html", gin.H{
"Title": "作品欣赏",
})
}
以上优雅停止服务,要测试的话需要通过命令行启动 go run .\main_gin.go 然后CTL+C 退出就可以看到效果了,如果此时正在请求服务端,并且请求还未结束(比如sleep5秒),那么结束的时候会等此请求结束后停止的
go-resty
简单的get请求加上重试机制
client := resty.New()
client.SetRetryCount(3).
SetRetryWaitTime(1 * time.Second).
SetRetryMaxWaitTime(2 * time.Second).
SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
println("我已经重试过了")
return 0, errors.New("quota exceeded")
})
//resp, err := client.R().Get("http://httpbin.org/get")
resp, err := client.R().Get("http://localhost:8081/sync/initTemplateCategory")
fmt.Printf("\nError: %v", err)
fmt.Printf("\nResponse Status Code: %v", resp.StatusCode())
fmt.Printf("\nResponse Status: %v", resp.Status())