努力学习围棋我的测试项目我正在构建一个简单的 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))
- 1 回答
- 0 关注
- 91 浏览
添加回答
举报
0/150
提交
取消