如何缩短 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 包,这应该是一种特殊情况),则永远不能将其称为地图。