【问题标题】:How to shorten struct declaration with same type attributes in Golang?如何在 Golang 中缩短具有相同类型属性的结构声明?
【发布时间】:2019-05-28 07:04:51
【问题描述】:

我有一个关于使用 Golang 输入导出包中的模块的问题。

例如,我想在包controllers中导出UserCtrl,而包api可以在导入包UserCtrl时使用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,因此结构UserCtrlTypegin.HandlerFunc 类型重复了很多次。

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

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

【问题讨论】:

  • “UserCtrlType 与 gin.HandlerFunc 类型重复多次”是什么意思?你想让“UserCtrl”成为一个基本结构,并且在 api 包中“扩展”它吗?
  • @DharmaSaputra,不,我想用命名方法导出UserCtrl,这意味着可以使用UserCtrl.findAll() 示例。但是UserCtrlTypegin.HandlerFunc 重复多次。有没有其他方法可以减少它或为我的目的使用其他方法?
  • 不用太费劲,我觉得可以重复输入gin.HandlerFunc
  • 我找到了问题的答案。 Tnx

标签: go go-gin


【解决方案1】:

通常在 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 包,这应该是一种特殊情况)。

【讨论】:

  • Tnx,你在 struct 中的缩短是我正在寻找的正确方式,但你的第一种方式,包controllers 中的导出函数不是我的需要。我找到了解决问题的方法
  • 通常在 Go 中你会将它们写成方法而不是 func 字段。
【解决方案2】:

我已经为我的问题找到了答案。我想由于我对 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)
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多