亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何縮短 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 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號