我有一个关于在Golang中输入要在包中导出模块的问题。
例如,我想在UserCtrl
包中导出controllers
,并且在导入api
包时,UserCtrl
包可以使用controllers
。
我也想用输入来导出UserCtrl
,这意味着在api
中,我可以调用名为的方法(例如UserCtrl.findOne()
或UserCtrl.findAll()
),而不使用map[string]interface{}
。
所以我在Golang中创建了新的UserCtrlType
类型作为struct
package controllers
import (
"github.com/gin-gonic/gin"
)
// UserCtrlType : Type controller for User
type UserCtrlType struct {
FindAll gin.HandlerFunc
FindOneByID gin.HandlerFunc
FindOneByUsername gin.HandlerFunc
}
// UserCtrl : Controller for User
var UserCtrl = UserCtrlType{
findAll,
findOneByID,
findOneByUsername,
}
func findAll(ctx *gin.Context) {
}
func findOneByID(ctx *gin.Context) {
}
func findOneByUsername(ctx *gin.Context) {
}
在api
包中,我导入controller
并使用:package api
import (
Controllers "github.com/huynhsamha/gin-go-app/controllers"
"github.com/gin-gonic/gin"
)
var userCtrl = Controllers.UserCtrl
func setUpUserRoutes(router *gin.RouterGroup) {
router.GET("/", userCtrl.FindAll)
router.GET("/n/:username", userCtrl.FindOneByUsername)
router.GET("/d/:id", userCtrl.FindOneByID)
}
我正在使用Gin,因此结构UserCtrlType
与gin.HandlerFunc
类型重复了很多次。还有其他方法可以解决我的问题,该方法可以导出
UserCtrl
(类型化)并减少重复的gin.HandlerFunc
类型声明。当我使用Node.JS时,我发现导出模块非常简单。我们可以用Golang简化这个问题吗?
最佳答案
通常,在Go中,您不会创建结构来包装诸如此类的函数声明;您将直接导出函数。
package controllers
import "github.com/gin-gonic/gin"
func FindAll(ctx *gin.Context) { ... }
router.GET("/", controllers.FindAll)
如果您确实想拥有一个包含它们作为变量函数引用的结构,则可以使用以下语法不要重复该类型:
type UserCtrlType struct {
FindAll, FindOneByID, FindOneByUsername gin.HandlerFunc
}
通常,在Go中,您可能会发现这是重复代码最少的代码(
if err != nil { return err }
出现很多)。在Go语言中,“使用打字”并不是一个特殊的概念。如果对象不是 map 对象,则永远不能将其称为 map (无需经过reflect
包,这应该是一种特殊情况)。