如何缩短 Golang 中具有相同类型属性的结构声明?
How to shorten struct declaration with same type attributes in Golang?
我对在 Golang 中输入一个包中的模块有疑问。
例如,我想在包 controllers
中导出 UserCtrl
,而包 api
可以在导入包 controllers
时使用 UserCtrl
。
我还想用 键入 导出 UserCtrl
,这意味着在 api
中,我可以 调用命名方法 ,例如 UserCtrl.findOne()
,或 UserCtrl.findAll()
,不使用 map[string]interface{}
。
所以我在 Golang 中创建了新类型 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
中,我导入 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 中简化这个问题吗?
我找到了问题的答案。我想由于我对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)
}
我将关闭这个问题。感谢您的关注。
通常在 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 }
出现了 lot)。 "With typing" 不是 Go 中的特殊概念;如果对象不是一个对象(不通过 reflect
包,这应该是一种特殊情况),则永远不能将其称为地图。
我对在 Golang 中输入一个包中的模块有疑问。
例如,我想在包 controllers
中导出 UserCtrl
,而包 api
可以在导入包 controllers
时使用 UserCtrl
。
我还想用 键入 导出 UserCtrl
,这意味着在 api
中,我可以 调用命名方法 ,例如 UserCtrl.findOne()
,或 UserCtrl.findAll()
,不使用 map[string]interface{}
。
所以我在 Golang 中创建了新类型 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
中,我导入 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 中简化这个问题吗?
我找到了问题的答案。我想由于我对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)
}
我将关闭这个问题。感谢您的关注。
通常在 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 }
出现了 lot)。 "With typing" 不是 Go 中的特殊概念;如果对象不是一个对象(不通过 reflect
包,这应该是一种特殊情况),则永远不能将其称为地图。