gpt4 book ai didi

go - 多个数据库驱动程序场景 : passing interface as type

转载 作者:行者123 更新时间:2023-12-01 20:24:47 24 4
gpt4 key购买 nike

场景:我有一个数据库类型实现了一些 CRUD 操作。

我想:

  • 抽象出数据库层以支持多个数据库
  • 将缓存层“放在它前面”作为读取缓存

  • 所以我的想法是:
  • 为 postgres 特定代码和缓存创建数据库接口(interface)
  • 将 postgres 类型传递给缓存构造函数,以便它可以从数据库
  • 中使用它

    请参阅下面的内容,了解我在分配时导致 cacheNew() 错误:

    cannot use dbdriver (variable of type interface{}) as database value in struct literal: missing method GetUser



    解决这个问题的最佳方法是什么?
    package main

    import "fmt"

    type database interface {
    GetUser(string)
    }

    type postgres struct {
    hostname string
    }

    func (p *postgres) GetUser(u string) {
    fmt.Printf("Postgres: GetUser %s\n", u)
    }

    type cache struct {
    db database
    }

    func cacheNew(dbdriver interface{}) cache {
    return cache{
    db: dbdriver,
    }
    }

    func (c *cache) GetUser(u string) {
    fmt.Printf("Cache: GetUser %s\n", u)

    c.db.GetUser(u)
    }

    func main() {
    // var db database

    db := postgres{
    hostname: "x",
    }
    db.GetUser("joe")

    dbViaCache := cacheNew(db)
    dbViaCache.GetUser("joe")
    }

    最佳答案

    为了解决您的问题,添加 newPostgres 构造函数。下面我对您的初始代码进行了更正。

    package main

    import "fmt"

    type database interface {
    GetUser(string)
    }

    type postgres struct {
    hostname string
    }

    func newPostgres(hostname string) *postgres {
    return &postgres{
    hostname: hostname,
    }
    }

    func (p *postgres) GetUser(u string) {
    fmt.Printf("Postgres: GetUser %s\n", u)
    }

    type cache struct {
    db database
    }

    func cacheNew(db database) cache {
    return cache{
    db: db,
    }
    }

    func (c *cache) GetUser(u string) {
    fmt.Printf("Cache: GetUser %s\n", u)

    c.db.GetUser(u)
    }

    func main() {
    db := newPostgres("x")

    db.GetUser("joe")

    dbViaCache := cacheNew(db)
    dbViaCache.GetUser("joe")
    }

    关于go - 多个数据库驱动程序场景 : passing interface as type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62103893/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com