2014-04-05 2 views
2
package main 

import(
    "fmt" 
) 

type A func (int,int) 

func (this A) Serve() { 
    fmt.Println("function 1") 
} 

func Serve(int,int) { 
    fmt.Println("function 2") 
}  
func main() { 
    a := A(Serve) 
    a.Serve() // function 1 
} 

함수 서브는 함수이기도 한 유형 A로 변환 될 수 있지만, 어떤 방식으로 문제를 해결해야하는지에 대해서는이 접근 방식을 사용해야하는시기와 이유를 알지 못합니다. 함수 유형을 다른 것으로? 내 예제는 무의미한 것 같습니다.Go에 어떤 함수 유형이 있습니까?

int, struct 등은 유형이며 int 및 struct와 같은 일반적인 유형과 다른 함수 유형은 뷰의 기본 데이터 구조 관점에서 정확히 무엇입니까?

고맙습니다.

답변

4

실제로 약간 혼란 스럽습니다. 이 기술은 구조체를 생성하고 함수를이 구조체 또는 다른 유사한 기법의 메서드로 만드는 번거 로움없이 인터페이스와 호환되는 일반 함수를 만드는 데 사용되는 것으로 나타났습니다.

훌륭한 예제는 표준 http 라이브러리에서 찾을 수 있습니다. 당신은 형에게

type HandlerFunc func(ResponseWriter, *Request) 

을 가지고 그리고 그것은 방법이 있습니다

type Handler interface { 
    ServeHTTP(ResponseWriter, *Request) 
} 

이가 다음을 수행 할 수 있습니다

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { 
    f(w, r) 
} 

이가이처럼 보이는 http.Handler 인터페이스로 사용할 수 있습니다를 http.ListenAndServe을 기본 http mux를 사용하지 않고 일반 기능으로 호출하십시오. 이 기능을 http.Handler으로 감싸면 "mux-less"서버를 만들 수 있습니다.

http.ListenAndServe(":8080", 
    http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
       //la di da 
    }) 
) 
:

따라서 당신이 뭔가를 할 수 있습니다

관련 문제