为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
倚天杖 2023-05-22 17:39:14
我有一个关于在 Golang 中输入一个包中的模块的问题。例如,我想UserCtrl在 package 中导出controllers,并且 package可以在 import package 时api使用。UserCtrlcontrollers我还想UserCtrl通过键入导出,这意味着api我可以调用命名方法,例如UserCtrl.findOne(),或者UserCtrl.findAll()不使用map[string]interface{}。所以我UserCtrlType在 Golang 中创建了新类型作为结构package controllersimport (    "github.com/gin-gonic/gin")// UserCtrlType : Type controller for Usertype UserCtrlType struct {    FindAll           gin.HandlerFunc    FindOneByID       gin.HandlerFunc    FindOneByUsername gin.HandlerFunc}// UserCtrl : Controller for Uservar UserCtrl = UserCtrlType{    findAll,    findOneByID,    findOneByUsername,}func findAll(ctx *gin.Context) {}func findOneByID(ctx *gin.Context) {}func findOneByUsername(ctx *gin.Context) {}在 package 中api,我导入controller并使用:package apiimport (    Controllers "github.com/huynhsamha/gin-go-app/controllers"    "github.com/gin-gonic/gin")var userCtrl = Controllers.UserCtrlfunc setUpUserRoutes(router *gin.RouterGroup) {    router.GET("/", userCtrl.FindAll)    router.GET("/n/:username", userCtrl.FindOneByUsername)    router.GET("/d/:id", userCtrl.FindOneByID)}我正在使用Gin,因此 structUserCtrlType使用 type 重复了很多次gin.HandlerFunc。有没有其他方法可以解决我的问题,可以导出UserCtrl(键入)并减少重复的类型gin.HandlerFunc声明。当我在 Node.JS 上工作时,我发现导出模块非常简单。我们可以在 Golang 中简化这个问题吗?
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

通常在 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如果一个对象不是一个对象(不通过包,这应该是一种特殊情况),则永远不能将其称为地图。


查看完整回答
反对 回复 2023-05-22
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

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

}


查看完整回答
反对 回复 2023-05-22
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信