Home  >  Article  >  Backend Development  >  Go doesn't understand how http.Server Handler calls functions attached to empty structs

Go doesn't understand how http.Server Handler calls functions attached to empty structs

WBOY
WBOYforward
2024-02-10 16:00:11582browse

Go 不理解 http.Server Handler 如何调用附加到空结构的函数

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.

Question content

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?

Workaround

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()

The

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete