>  기사  >  백엔드 개발  >  Golang의 값과 유형으로서의 함수에 대한 자세한 설명

Golang의 값과 유형으로서의 함수에 대한 자세한 설명

藏色散人
藏色散人앞으로
2020-11-13 13:58:492457검색

튜토리얼 칼럼에서 Golang의 기능을 값과 유형으로 소개하는 내용입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

Golang의 값과 유형으로서의 함수에 대한 자세한 설명소개

Go 언어에서는 함수를 변수로 사용하고 유형을 사용하여 정의한 다음 이 함수 유형을 값으로 전달할 수 있고 심지어 메소드도 구현할 수 있습니다. 매우 유연하여 때로는 유형 변환에 이 기능을 사용할 수도 있습니다. 값으로 전달하기 위한 조건은 유형이 동일한 매개변수와 동일한 반환 값을 갖는 것입니다.

함수 유형 변환

Go 언어에서 유형 변환의 기본 형식은 다음과 같습니다.
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    
// 我是一个函数类型    
// 我是一个函数类型

위와 같이 CalculateType 함수 유형을 선언하고 Serve() 메소드를 구현합니다. , 동일한 매개 변수를 갖게 됩니다. add 및 mul은 강제로 CalculateType 함수 유형으로 변환되며 두 함수 모두 CalculateType 함수 유형의 Serve() 메서드를 갖습니다.

매개변수 전달을 위한 함수

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

위 예시와 같이 Calculate의 f 매개변수 유형은 CalculateType이고, add 및 mul 함수는 CalculateType 함수 유형과 동일한 매개변수 및 반환값을 가지므로 add 및 mul 함수는 함수의 매개변수로 Calculate에 전달될 수 있습니다.

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

처음 이 소스 코드를 봤을 때 정말 혼란스러웠습니다. 이 소스 코드의 목적은 다음과 같이 핸들러가 ServeHTTP() 메서드를 구현하도록 하는 것입니다. 다음 예 :
func sayHi(w http.ResponseWriter, r *http.Request) 
{      
io.WriteString(w, "hi")    
}        
func main() {      
http.HandlerFunc("/", sayHi)      
http.ListenAndserve(":8080", nil)    
}
HandlerFunc는 함수 유형이고 sayHi 함수는 HandlerFunc 함수 유형과 동일한 매개변수 값을 갖기 때문에 sayHi를 강제로 HandlerFunc로 변환할 수 있으므로 sayHi에도 ServeHTTP() 메소드가 있는데, Handler 인터페이스를 구현함과 동시에 HandlerFunc의 ServeHTTP 메소드가 자체적으로 실행되는데, 이는 sayHi 함수가 Handler 호출 후의 실행 결과임을 알 수 있다.

위 내용은 Golang의 값과 유형으로서의 함수에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제