代码之家  ›  专栏  ›  技术社区  ›  Ha. Huynh Rodrigo Oliveira

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

  •  0
  • Ha. Huynh Rodrigo Oliveira  · 技术社区  · 6 年前

    我想知道 戈兰尼 语言

    今天我有个问题 通过键入导出包中的模块 在Golang。

    例如,我想导出 UserCtrl 在里面 包裹 controllers 包裹 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) {
    
    }
    

    一揽子 应用程序编程接口 ,我进口 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 因此,结构 用户类型 重复多次 带类型 gin.HandlerFunc .

    有没有其他方法可以解决我的问题,可以导出 用户命令 ( 类型化的 ) 减少重复 类型 吉恩汉德勒芬克 声明。

    当我在工作的时候 J.N. ,我发现导出模块非常简单。我们能在戈兰简化这个问题吗?

    编辑

    我找到了我问题的答案。我很快就会结束这个问题。谢谢您。

    2 回复  |  直到 6 年前
        1
  •  0
  •   David Maze    6 年前

    通常,在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中,输入“不是一个特殊的概念;如果对象不是一个映射,则永远不能将其引用为一个映射(不经过 reflect 包装,应该是特殊情况)。

        2
  •  1
  •   Ha. Huynh Rodrigo Oliveira    6 年前

    我找到了我问题的答案。我想因为我对歌朗的了解有限,我以前没有想到一个简单的方法来解决我的问题。

    这是我的问题答案:

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

    我将结束这个问题。谢谢你的关注。

    推荐文章