php editor Banana is here to answer a question about the Go language: Go does not understand how the http.Server Handler calls a function attached to an empty structure. In the Go language, http.Server is a structure used to process HTTP requests, and the Handler field is an interface type. An interface type is a special type that defines a set of methods. When we assign a function to the Handler field, the Go language will use the reflection mechanism to call the function. However, if we attach a function to an empty structure, the Go language will not understand how to call the function correctly. This is because when a method is called on an empty structure, the actual object instance cannot be obtained. To solve this problem, we can use closures or methods with receivers.
I have a simple web server code, but I don't understand this code:
Handler: app.routes(),
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) } }
In the routing file:
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 }
This is effective, the routes() function called when a request is received, But how does this routes() know to be triggered when it's attached to an empty struct?
app := Config{}
Where does the application know about routes()?
What is func (app *config)
in function?
The route is attached to the http server as shown below.
srv := &http.server{ addr: ":8081", // port handler: app.routes() // a handler to invoke }
routes
is a method of the config
structure. Even if config
is empty, we can still call the routes
method as in the code.
cfg := Config{} r := cfg.routes()
config
structure acts here as a method receiver.
The above is the detailed content of Go doesn't understand how http.Server Handler calls functions attached to empty structs. For more information, please follow other related articles on the PHP Chinese website!