文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何调用go-gin中的接口函数?

2024-04-05 00:05

关注

Golang不知道大家是否熟悉?今天我将给大家介绍《如何调用go-gin中的接口函数?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

这是存储库+控制器

package brand

import (
    "path/to/models"
    "gorm.io/gorm"

    "github.com/gin-gonic/gin"
)

type responsebrand struct {
    items      []models.masterbrand `json:"items"`
    totalcount int                  `json:"total"`
}

type repository interface {
    getall() (responsebrand, error)
}

type dbrepo struct {
    db *gorm.db
}


func (repo *dbrepo) getall() (responsebrand, error) {
    var response responsebrand
    var brands []models.masterbrand

    repo.db.find(&brands)

    response.items = brands
    response.totalcount = len(brands)

    return response, nil
}

func list(c *gin.context) {
    // this is an error
    res, _ := repository.getall()
}

这用于路由组

func ApplyRoutes(r *gin.RouterGroup) {
    brand := r.Group("/brand") {
        brand.GET("/", list)
    }
}

我尝试在我的项目中实现存储库,但仍然坚持在我们的控制器函数list中调用repository.getall()。我用杜松子酒和戈尔姆来做这个


解决方案


接口只是类型必须具有的一组方法签名,以便实现该特定接口。所以不能调用接口。

在您的示例代码中,dbrepo 应该实现 repository 接口和函数 list() 是一个函数,允许列出实现 repository 的任何类型的内容。为此,显然 list() 需要知道要列出哪个 repository 类似类型的实例 - 例如接收它作为参数。像这样:

func list(ctx *gin.context, repo repository) {
    // here call getall() which must exist on all types passed (otherwise they don't
    // implement repository interface
    res, _ := repo.getall()
    // ...
}

现在 gin 无法将修改后的列表作为路由器函数,因为这样的签名只是 (ctx *gin.context) 但您可以使用匿名函数并将存储库感知的 list() 包装在它。

func applyroutes(repo repository, r *gin.routergroup) {
    brand := r.group("/brand") {
        brand.get("/", func(ctx *gin.context) {
            list(repo)
        })
    }
}

此外,您的 applyroutes() 函数需要知道应该在哪个存储库路由上运行 - 为了简单起见,我将其添加到此处作为参数,其他优雅的解决方案是将整个控制器包装在类型中并获取 repository 实例作为接收器字段.

func ApplyRoutes(repo Repository, r *gin.RouterGroup) {
brand := r.Group("/brand") {
    brand.GET("/", func(ctx *gin.Context) {
        list(ctx, repo)
    })
}}

如果没有,这可能会起作用。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持编程网!更多关于Golang的相关知识,也可关注编程网公众号。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯