如何理解Go的 type func

学Go不久,在看一些小源码,对这一段不太理解 :

type handler func(w http.ResponseWriter, r *http.Request) (interface{}, *handlerError)


func listBooks(w http.ResponseWriter, r *http.Request) (interface{}, *handlerError) {
return books, nil
}

router := mux.NewRouter()
router.Handle("/books", handler(listBooks)).Methods("GET")

通过 type handler func 定义了一个新的类型handler,为func(w http.ResponseWrite…………)的别名。

代码中的用法 handler(listBooks) 是什么意思呢? 把listBooks作为参数吗?不知道哪位能帮忙把这段翻译成不用handler的样子

共 5 个回复


shenjiayu

之前也有过不理解。。。golang官网的源码意思是通过handler(listBooks)listBooks封装成一个handler

# 0

David

handler(listBooks) 是吧 listBooks 强制转换成 handler 类型。

通常这样的用法的目的是 handler 会实现 router.Handle 第二个参数所需要的接口,你看看附近应该有类似 func (handler) Xxxx(...) 的代码。

# 1

yeelone

谢谢。懂了。

# 2

kevin

这段代码是哪里的,我也是新手,想看一下

# 3

idea_go

查看源码中如下代码
net/http/server.go#1999
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)

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

HandlerFunc 对象自己实现了ServeHTTP 接口,然后调用了一下f(w, r)方法,算是将目标函数转换成ServeHTTP 接口函数

# 4