函数代码如下:
go
package main
import (
"fmt"
"log"
"net/http"
)
type dollars float32
func (d dollars) String() string{
return fmt.Sprintf("%.2f", d)
}
type database map[string]dollars
func (db database) list (w http.ResponseWriter, req *http.Request){
for item, price := range db {
fmt.Fprintf(w, "%s:%s\n", item, price)
}
}
func main(){
db := database{"shose":50, "socks":5}
http.HandleFunc("/list", db.list)
log.Fatal(http.ListenAndServe("localhost:8000", nil))
}
问题分析:list
函数中的req *http.Request
没有显示的调用过,但编译器并没有相应的提示和报错
原因:
- 在
Go
语言中,当一个函数或方法是用来满足某个接口,或者作为特定类型(如Http.Handlefunc
)的回调时,即使函数体内部没有显式使用所有参数,编译器或linter
通常也不会将其标记为 "not used
" - 在这个例子中:这个方法被用作
http.HandleFunc("/list", db.list)
的第二个参数。而 HandFunc期望的第二个参数是一个具有func(http.ResponseWriter, *http.Request)
签名的函数,因此为了让list
函数正确使用,必须匹配相应的签名类型。