如何缩短 Golang 中具有相同类型属性的结构声明?

我有一个关于在 Golang 中输入一个包中的模块的问题。


例如,我想UserCtrl在 package 中导出controllers,并且 package可以在 import package 时api使用。UserCtrlcontrollers


我还想UserCtrl通过键入导出,这意味着api我可以调用命名方法,例如UserCtrl.findOne(),或者UserCtrl.findAll()不使用map[string]interface{}。


所以我UserCtrlType在 Golang 中创建了新类型作为结构


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) {


}

在 package 中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,因此 structUserCtrlType使用 type 重复了很多次gin.HandlerFunc。


有没有其他方法可以解决我的问题,可以导出UserCtrl(键入)并减少重复的类型gin.HandlerFunc声明。


当我在 Node.JS 上工作时,我发现导出模块非常简单。我们可以在 Golang 中简化这个问题吗?


倚天杖
浏览 81回答 2
2回答

白板的微信

通常在 Go 中,您不会创建一个结构来包装一堆这样的函数声明;您只需直接导出功能即可。package controllersimport "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 中并不是一个特殊的概念;reflect如果一个对象不是一个对象(不通过包,这应该是一种特殊情况),则永远不能将其称为地图。

江户川乱折腾

我找到了我的问题的答案。我认为由于我对 Golang 的了解有限,我之前没有想到更简单的方法来解决我的问题。这是我对我的问题的回答:package controllersimport "github.com/gin-gonic/gin"// UserCtrl : Controller for Usertype 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) {}并在包装中apipackage apiimport (    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)}
打开App,查看更多内容
随时随地看视频慕课网APP