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

努力学习围棋

我的测试项目

我正在构建一个简单的 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 main


import (

    "examProg/config"

    "examProg/controllers"

    "fmt"

    "log"

    "net/http"


    "github.com/gorilla/mux"

    _ "github.com/mattn/go-sqlite3"

)


我不明白如何实现 http.HandlerFunc 🙃


青春有我
浏览 92回答 1
1回答

守着星空守着你

该表达式controllers.HostController.GetAllHosts是一个方法表达式。方法表达式的结果是function,除了method's 参数之外,还采用接收者类型的实例作为其第一个参数。因此出现“调用中没有足够的参数......”错误。为了显示:f := controllers.HostController.GetAllHostsfmt.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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go