Maison > Article > développement back-end > Explication détaillée des fonctions en tant que valeurs et types dans Golang
En langage Go, nous pouvons utiliser la fonction comme variable et utiliser le type pour la définir, puis ce type de fonction peut être transmis sous forme de valeurs et peut même implémenter des méthodes. Cette fonctionnalité est si flexible que nous pouvons parfois même l'utiliser pour la conversion de type. Les conditions de passage en valeur sont que les types aient les mêmes paramètres et la même valeur de retour.
Le format de base de la conversion de type en langage Go est le suivant :
type_name(expression)
package main import "fmt" type CalculateType func(int, int) // 声明了一个函数类型 // 该函数类型实现了一个方法 func (c *CalculateType) Serve() { fmt.Println("我是一个函数类型") } // 加法函数 func add(a, b int) { fmt.Println(a + b) } // 乘法函数 func mul(a, b int) { fmt.Println(a * b) } func main() { a := CalculateType(add) // 将add函数强制转换成CalculateType类型 b := CalculateType(mul) // 将mul函数强制转换成CalculateType类型 a(2, 3) b(2, 3) a.Serve() b.Serve() } // 5 // 6 // 我是一个函数类型 // 我是一个函数类型comme ci-dessus, déclare un type de fonction CalculateType, implémente la méthode Serve() et convertit add et mul avec les mêmes paramètres dans le type de fonction CalculateType. En même temps, les deux fonctions ont la méthode Serve() de la fonction CalculateType. taper.
Paramètres de transmission de fonction
package main import "fmt" type CalculateType func(a, b int) int // 声明了一个函数类型 // 加法函数 func add(a, b int) int { return a + b } // 乘法函数 func mul(a, b int) int { return a * b } func Calculate(a, b int, f CalculateType) int { return f(a, b) } func main() { a, b := 2, 3 fmt.Println(Calculate(a, b, add)) fmt.Println(Calculate(a, b, mul)) } // 5 // 6
Comme dans l'exemple ci-dessus, le type de paramètre f de Calculate est CalculateType, et les fonctions add et mul ont les mêmes paramètres et valeurs de retour comme type de fonction CalculateType. Par conséquent, les fonctions add et mul peuvent être transmises en tant que paramètres dans la fonction Calculate.
// HandleFunc registers the handler function for the given pattern // in the DefaultServeMux. // The documentation for ServeMux explains how patterns are matched. func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { DefaultServeMux.HandleFunc(pattern, handler) }
// HandleFunc registers the handler function for the given pattern. func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { mux.Handle(pattern, HandlerFunc(handler)) }
type HandlerFunc func(ResponseWriter, *Request) // ServeHTTP calls f(w, r). func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) }
Quand j'ai vu ce code source pour la première fois, j'étais vraiment confus. Le but de ce code source est de notre gestionnaire. obligé d'implémenter la méthode ServeHTTP(), comme dans l'exemple suivant :
func sayHi(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "hi") } func main() { http.HandlerFunc("/", sayHi) http.ListenAndserve(":8080", nil) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!