Análisis de uso del tipo func () en golang

Al mirar el código de la parte del servicio http de golang, me desconcertó el tipo func () en golang y no entendí el código durante un tiempo. Después de verificar la información, entendí un poco.
En golang, un servicio http se puede implementar simplemente así

package main

import "net/http"

func mHttp() {
    http.HandleFunc("/", h)
    http.ListenAndServe("0.0.0.0:8888",nil)
}
func h(w http.ResponseWriter, r *http.Request) {

}

http.HandleFunc()Es una función de registro, pasando una ruta de tipo cadena, y una función, el parámetro de la función es (http.ResponseWriter, * http.Request) . Función de entrada de seguimiento, en el archivo de código fuente de golang net / http / server.go

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

Llamado en HandleFuncDefaultServeMux.HandleFunc(pattern, handler)
En cuanto al propósito de estas funciones, no vamos a discutirlo, este no es el tema central de este artículo.
Seguir la función nuevamente

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    if handler == nil {
        panic("http: nil handler")
    }
    mux.Handle(pattern, HandlerFunc(handler))
}

¿Qué diablos es el segundo parámetro en mux.Handle (patrón, HandlerFunc (controlador))HandlerFunc(handler) .
Seguimiento

type HandlerFunc func(ResponseWriter, *Request)

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}

Resulta que HandlerFunc es una función definida por tipo , y el tipo de función es el tipo que se pasó originalmente. func(ResponseWriter, *Request)
ServeHTTP es un método de HandlerFunc (tenga en cuenta que los métodos y funciones en golang no son lo mismo). Y HandlerFunc implementa el manejador de la interfaz de
definición de interfaz Handler:

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

Volviendo al método HandleFunc , mux.Handle(pattern, HandlerFunc(handler))el segundo parámetro es forzar el controlador de función pasado al tipo HandlerFunc , de modo que el controlador implemente la interfaz Handler.
En este punto, entendemos que HandlerFunc(handler)es forzar funciones ordinarias a funciones definidas por tipo.
Ahora escriba una demostración simple para verificar:

package main

import "fmt"

func main() {
   one(2, callback)
}

//需要传递函数
func callback(i int) {
   fmt.Println("i am callBack")
   fmt.Println(i)
}

//main中调用的函数
func one(i int, f func(int)) {
   two(i, fun(f))
}

//one()中调用的函数
func two(i int, c Call) {
   c.call(i)
}

//定义的type函数
type fun func(int)

//fun实现的Call接口的call()函数
func (f fun) call(i int) {
   f(i)
}

//接口
type Call interface {
   call(int)
}

Primero mira los resultados del programa:


Llamamos a la función one () en la función main () , pasamos la función callback () y finalmente llamamos a la función callback () que pasamos .

 

Piénsalo:

Utilice la función de definición de tipo func (int) para
definir la interfaz de llamada . Hay una llamada de función (int)
en Call que llama a uno (2, callback) en main () , llama a dos () en uno () y pasa la función two () Anteriormente, la conversión de tipos se implementó para la función de devolución de llamada, de una función ordinaria a una función definida por tipo. Llame a la c entrante en dos () porque c implementa la interfaz de llamada , por lo que puede llamar a la función call () y finalmente llamar a la función callback () que le pasamos .

Supongo que te gusta

Origin blog.csdn.net/qq_32907195/article/details/112189207
Recomendado
Clasificación