Go语言http.Server Handler关联空结构体方法的原理疑问
Go Web服务器代码疑问解答
你编写的简易Web服务器Go代码中,Handler:app.routes()能正常运行,但你有三个疑问,以下是解答:
1. 关联空结构体Config{}的routes()方法为何能被触发?
Go允许给空结构体绑定方法,只要方法接收者是该结构体(或其指针)即可。routes()的逻辑完全在方法内部:创建chi路由实例、配置CORS规则、注册路由,最后返回路由对象,全程不需要依赖Config实例的任何字段。所以哪怕Config是空结构体,只要有它的实例,就能调用这个方法,完全不影响方法执行。
2. 实例app是如何知晓routes()方法的?
因为routes()是绑定到*Config类型的方法,Go的类型系统会自动把方法和对应类型关联。当你定义func (app *Config) routes()时,所有Config类型的实例(比如app)都能调用这个方法——Go会自动把值类型的app转为指针,所以你直接写app.routes()也能正常运行。相当于类型和它的方法是绑定在一起的,实例自然能调用属于自己类型的方法。
3. 函数定义中的(app *Config)是什么含义?
这是Go的方法接收者,具体含义:
*Config表示这个方法属于Config结构体的指针类型;app是接收者的变量名(可自定义,比如换成cfg也没问题),在方法内部可以通过它访问Config实例的字段(如果以后给Config添加字段的话)。
简单说,这是把普通函数变成某个类型专属方法的语法,让该类型的实例能调用这个方法。
主文件代码
const webPort = "80" type Config struct {} func main() { app := Config{} log.Printf("Starting broker service on port %s\n",webPort) srv := &http.Server{ Addr: fmt.Sprintf(":%s",webPort), Handler:app.routes(), } err := srv.ListenAndServe() if(err != nil) { log.Panic(err) } }
routes文件代码
func (app *Config) routes() http.Handler { mux := chi.NewRouter() mux.Use(cors.Handler(cors.Options{ AllowedOrigins: []string{"http://*","https://*"}, AllowedMethods: []string{"GET", "POST", "DELETE","PUT","OPTIONS"}, AllowedHeaders: []string{"Accept","Authorization","Content-Type","X-CSRF-Token"}, ExposedHeaders: []string{"Link"}, AllowCredentials:true, MaxAge:300, })) mux.Use(middleware.Heartbeat("/ping")) mux.Post("/",app.Broker) return mux }
内容的提问来源于stack exchange,提问作者user63898
相关产品推荐
相关产品推荐

