Go语言如何将配置文件读取的字符串传递给http handler处理函数
解决方案
Go语言中不需要借助全局变量,有两种常用方案可以把配置参数传递给HTTP处理函数:
方案1:用闭包生成处理函数(适合参数较少的场景)
直接构造一个接收重定向目标地址的工厂函数,返回符合http.HandlerFunc签名的闭包,闭包会自动捕获外部传入的配置参数:
func main(){ // 这里是你从配置文件读取的内容 var inputFromConfigFile = "https://www.example.com:443" go func() { // 调用工厂函数传入配置,得到处理函数 if err := http.ListenAndServe(":80", redirectTLSFactory(inputFromConfigFile)); err != nil { log.Fatalf("ListenAndServe error: %v", err) } }() } // 工厂函数,接收配置参数,返回实际的处理函数 func redirectTLSFactory(target string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, target + r.RequestURI, http.StatusMovedPermanently) } }
方案2:自定义结构体实现http.Handler接口(适合配置项较多、需要扩展的场景)
如果后续还要给重定向逻辑加更多配置(比如跳转状态码、白名单域名等),可以定义专属的配置结构体,实现ServeHTTP方法即可:
// 重定向配置结构体,可扩展任意字段 type TLSRedirectConfig struct { TargetAddr string // 从配置文件读取的目标TLS地址 } // 实现http.Handler接口的ServeHTTP方法 func (c *TLSRedirectConfig) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, c.TargetAddr + r.RequestURI, http.StatusMovedPermanently) } func main(){ var inputFromConfigFile = "https://www.example.com:443" // 初始化配置结构体 redirectHandler := &TLSRedirectConfig{ TargetAddr: inputFromConfigFile, } go func() { // 直接传入实现了Handler接口的结构体实例 if err := http.ListenAndServe(":80", redirectHandler); err != nil { log.Fatalf("ListenAndServe error: %v", err) } }() }
两种方案都完全不需要定义全局变量,配置参数的生命周期和处理函数绑定,适配多实例部署的场景也不会有冲突。
内容的提问来源于stack exchange,提问作者Freez3r
相关产品推荐
相关产品推荐

