为了账号安全,请及时绑定邮箱和手机立即绑定

学习围棋:如何使用http.HandlerFunc?

学习围棋:如何使用http.HandlerFunc?

Go
青春有我 2023-02-06 19:09:19
努力学习围棋我的测试项目我正在构建一个简单的 API 来与轻型 SQL 数据库进行通信。我创建了这个函数,它从数据库表中获取所有主机。据我所知,我的函数应该接受一个指向数据库的指针并返回给我 http.HandlerFunc。func (h HostController) GetAllHosts(db *sql.DB) http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) {        var host entities.Host        var hosts []entities.Host        var errorMessage entities.Error        rows, err := db.Query("SELECT * FROM hosts WHERE hosts = ?", host)        if err != nil {            errorMessage.Message = "Error: Get all hosts"            utils.SendError(w, http.StatusInternalServerError, errorMessage)            return        }        defer rows.Close()        for rows.Next() {            err := rows.Scan(&host.ID, &host.Uuid, &host.Name, &host.IPAddress)            if err != nil {                errorMessage.Message = "Error: (Get all hosts) Can't scan rows"                utils.SendError(w, http.StatusInternalServerError, errorMessage)                return            }            hosts = append(hosts, host)        }        ////If hosts slice is empty -> no data in database        if len(hosts) == 0 {            errorMessage.Message = "No found hosts in database"            utils.SendError(w, http.StatusInternalServerError, errorMessage)            return        }        //Convert containers content to JSON representation        w.Header().Set("Content-Type", "application/json")        utils.SendSuccess(w, hosts)    }}现在,到这里一切都应该很好,但我不知道如何在 main.go 构建布局上实现它:.├── controllers│       └── hostcontroller.go│       └── main.go这就是我试图在 main.go 上实现它的方式package mainimport (    "examProg/config"    "examProg/controllers"    "fmt"    "log"    "net/http"    "github.com/gorilla/mux"    _ "github.com/mattn/go-sqlite3")我不明白如何实现 http.HandlerFunc 🙃
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

该表达式controllers.HostController.GetAllHosts是一个方法表达式。方法表达式的结果是function,除了method's 参数之外,还采用接收者类型的实例作为其第一个参数。


因此出现“调用中没有足够的参数......”错误。


为了显示:


f := controllers.HostController.GetAllHosts

fmt.Println(reflect.TypeOf(f))

// output: func(controllers.HostController, *sql.DB)

因此,要使代码编译,您需要将一个实例传递controllers.HostController给调用,即


controllers.HostController.GetAllHosts(controllers.HostController{}, db)

如您所见,它并不漂亮。方法表达式有它们的用处,我敢肯定,但我没有遇到太多。相反,我最常看到的是方法 values的使用。


h := controllers.HostController{}

router.Handle("/host", h.GetAllHosts(db))


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信