Go中的函数类型有什么用途?

时间:2014-04-05 15:01:53

标签: function go

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,这也是一个函数,但是,我只是不知道何时以及为什么我们应该使用这种方法,来处理我们应该转换函数的类型问题键入另一个?我的例子似乎毫无意义。

int,struct等是类型,从底层数据结构的角度来看,函数类型究竟与int和struct等常见的已知类型有什么不同?

非常感谢!

1 个答案:

答案 0 :(得分:4)

确实有点令人困惑。我已经看到这种技术用于使普通函数与接口兼容,而无需创建结构的麻烦,并使该函数成为此结构的方法 - 或其他类似技术。

在标准的http库中可以找到一个很好的例子。你有类型

type HandlerFunc func(ResponseWriter, *Request)

它有方法:

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

这允许它用作http.Handler接口,如下所示:

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

这允许您在不使用默认http mux的情况下在普通函数上调用http.ListenAndServe。将函数包装为http.Handler可以创建一个" mux-less"服务器。

因此你可以这样做:

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