Maison  >  Article  >  développement back-end  >  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

藏色散人
藏色散人avant
2020-11-13 13:58:492515parcourir

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)

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    
// 我是一个函数类型    
// 我是一个函数类型
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.

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)    }
// 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)    
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer