我有一个关于在Golang中输入要在包中导出模块的问题。
例如,我想在UserCtrl包中导出controllers,并且在导入api包时,UserCtrl包可以使用controllers
我也想用输入来导出UserCtrl,这意味着在api中,我可以调用名为的方法(例如UserCtrl.findOne()UserCtrl.findAll()),而不使用map[string]interface{}
所以我在Golang中创建了新的UserCtrlType类型作为struct

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简化这个问题吗?

最佳答案

通常,在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语言中,“使用打字”并不是一个特殊的概念。如果对象不是 map 对象,则永远不能将其称为 map (无需经过reflect包,这应该是一种特殊情况)。

07-24 17:38