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

WBOY
Release: 2024-02-10 16:00:11
forward
581 people have browsed it

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)
    }
}
Copy after login

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
}
Copy after login

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{}
Copy after login

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
 }

Copy after login

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

Copy after login
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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!