Maison > développement back-end > Golang > Explication détaillée des fonctions en tant que valeurs et types dans Golang

Explication détaillée des fonctions en tant que valeurs et types dans Golang

藏色散人
Libérer: 2020-11-13 13:58:49
avant
2563 Les gens l'ont consulté

Introduction

Explication détaillée des fonctions en tant que valeurs et types dans GolangEn 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.

Conversion de type de fonction

Le format de base de la conversion de type en langage Go est le suivant :

type_name(expression)
Copier après la connexion

Par exemple :
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    
// 我是一个函数类型    
// 我是一个函数类型
Copier après la connexion
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
Copier après la connexion

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.

Exemple de code source du package Net/http

// 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)    }
Copier après la connexion
// HandleFunc registers the handler function for the given pattern.    func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {      mux.Handle(pattern, HandlerFunc(handler))    }
Copier après la connexion
type HandlerFunc func(ResponseWriter, *Request)        
// ServeHTTP calls f(w, r).    
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {      f(w, r)    }
Copier après la connexion

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)    
}
Copier après la connexion

Parce que HandlerFunc est un type de fonction et que la fonction sayHi a la même valeur de paramètre que le type de fonction HandlerFunc, donc sayHi peut être forcé à être converti en HandlerFunc, donc sayHi a également la méthode ServeHTTP(), qui implémente l'interface Handler. En même temps, la méthode ServeHTTP de HandlerFunc s'exécute, ce qui est la fonction sayHi. après l'appel du gestionnaire.

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal