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

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

藏色散人
풀어 주다: 2020-11-13 13:58:49
앞으로
2562명이 탐색했습니다.

튜토리얼 칼럼에서 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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿