首页 > 解决方案 > 如何在 Golang 中缩短具有相同类型属性的结构声明?

问题描述

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

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

另外我想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,因此该结构UserCtrlType与 type 重复了很多次gin.HandlerFunc

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

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

标签: gogo-gin

解决方案


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


推荐阅读