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

时间:2019-01-01 02:24:59

标签: go gin

我正在尝试了解 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简化这个问题吗?

编辑

我已经找到问题的答案。我将尽快解决这个问题。谢谢。

2 个答案:

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