Skip to main content

gva initServer

看上去一样,但是启动代码好像只调用了一次 initServer,并没有区分是调用哪个

alt text

在 Go 中,文件的构建标签(build tags)用于条件编译。通过构建标签,你可以指定某些文件只在特定平台上编译,而其他文件则在不同的平台上编译。

你提到的两个文件使用了不同的构建标签:

  1. //go:build !windows// +build !windows 表示这个文件在非 Windows 平台上编译。
  2. //go:build windows// +build windows 表示这个文件在 Windows 平台上编译。

文件内容

非 Windows 平台的 initServer 实现:

//go:build !windows
// +build !windows

package core

import (
"time"

"github.com/fvbock/endless"
"github.com/gin-gonic/gin"
)

func initServer(address string, router *gin.Engine) server {
s := endless.NewServer(address, router)
s.ReadHeaderTimeout = 20 * time.Second
s.WriteTimeout = 20 * time.Second
s.MaxHeaderBytes = 1 << 20
return s
}

Windows 平台的 initServer 实现:

//go:build windows
// +build windows

package core

import (
"net/http"
"time"

"github.com/gin-gonic/gin"
)

func initServer(address string, router *gin.Engine) server {
return &http.Server{
Addr: address,
Handler: router,
ReadTimeout: 20 * time.Second,
WriteTimeout: 20 * time.Second,
MaxHeaderBytes: 1 << 20,
}
}

如何工作

当你编译或运行你的 Go 项目时,Go 编译器会根据当前平台自动选择合适的文件进行编译。具体来说:

  • 在 Windows 平台上,只有带有 //go:build windows// +build windows 标签的文件会被编译,其他带有 //go:build !windows// +build !windows 标签的文件会被忽略。
  • 在非 Windows 平台上,带有 //go:build windows// +build windows 标签的文件会被忽略,只有带有 //go:build !windows// +build !windows 标签的文件会被编译。

代码调用

在你的启动代码中,只需要调用 initServer 函数即可,Go 编译器会根据当前平台自动选择正确的 initServer 实现。

例如:

func RunWindowsServer() {
// 其他初始化代码省略...

address := fmt.Sprintf(":%d", global.GVA_CONFIG.System.Addr)
s := initServer(address, Router)

global.GVA_LOG.Info("server run success on ", zap.String("address", address))

fmt.Printf(`
欢迎使用 gin-vue-admin
当前版本:v2.6.5
加群方式:微信号:shouzi_1994 QQ群:470239250
项目地址:https://github.com/flipped-aurora/gin-vue-admin
插件市场:https://plugin.gin-vue-admin.com
GVA讨论社区:https://support.qq.com/products/371961
默认自动化文档地址:http://127.0.0.1%s/swagger/index.html
默认前端文件运行地址:http://127.0.0.1:8080
--------------------------------------版权声明--------------------------------------
** 版权所有方:flipped-aurora开源团队 **
** 版权持有公司:北京翻转极光科技有限责任公司 **
** 剔除授权标识需购买商用授权:https://gin-vue-admin.com/empower/index.html **
`, address)

global.GVA_LOG.Error(s.ListenAndServe().Error())
}

在这个函数中,initServer 的调用不需要区分平台,因为 Go 编译器会根据当前的构建环境自动选择正确的 initServer 函数实现。

总结

通过使用构建标签,你可以在不同的平台上使用不同的实现,而不需要在代码中显式区分平台。Go 编译器会根据当前的平台自动选择合适的文件进行编译,这样你就可以在启动代码中直接调用 initServer,而不需要担心平台差异。