我正在尝试了解 Golang 语言
今天,我对在Golang中键入在包中导出模块存在疑问。
例如,我想导出软件包UserCtrl
中的controllers
,并且软件包api
可以使用{{1 }}导入软件包UserCtrl
时。
我还想通过键入导出controllers
,这意味着在UserCtrl
中,我可以调用命名方法,例如{{1} }或api
,不使用UserCtrl.findOne()
。
所以我在Golang中创建了新类型UserCtrl.findAll()
作为结构
map[string]interface{}
在软件包UserCtrlType
中,我导入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
我正在与Gin一起工作,因此结构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)
}
。
还有其他方法可以解决我的问题,该方法可以导出UserCtrlType
(类型)并减少重复类型的gin.HandlerFunc
声明。
在使用 Node.JS 时,我发现导出模块非常简单。我们可以用Golang简化这个问题吗?
我已经找到问题的答案。我将尽快解决这个问题。谢谢。
答案 0 :(得分:1)
我已经找到问题的答案。我认为由于我对Golang的了解有限,所以我以前没有想到过解决问题的简单方法。
这是我对问题的回答:
package controllers
import "github.com/gin-gonic/gin"
// UserCtrl : Controller for User
type UserCtrl struct{}
// FindAll :
func (ctrl UserCtrl) FindAll(ctx *gin.Context) {
}
// FindOneByID :
func (ctrl UserCtrl) FindOneByID(ctx *gin.Context) {
}
// FindOneByUsername :
func (ctrl UserCtrl) FindOneByUsername(ctx *gin.Context) {
}
并且在api
包中
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)
}
我将结束这个问题。感谢您的关注。
答案 1 :(得分:0)
通常,在Go中,您不会创建结构来包装一堆这样的函数声明;您只需直接导出函数即可。
package controllers
import "github.com/gin-gonic/gin"
func FindAll(ctx *gin.Context) { ... }
router.GET("/", controllers.FindAll)
如果您真的想拥有一个包含它们作为 variable 函数引用的结构,则可以使用语法来不重复该类型:
type UserCtrlType struct {
FindAll, FindOneByID, FindOneByUsername gin.HandlerFunc
}
通常,在Go语言中,您可能会发现这是重复代码最少的代码(if err != nil { return err }
出现 lot )。在Go语言中,“使用打字”并不是一个特殊的概念;如果该对象不是一个对象,则永远不能将其称为地图(无需经过reflect
包,这应该是一种特殊情况)。