V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
evan0724
V2EX  ›  Go 编程语言

golang 一个函数返回不同的结构体有比较优雅的实现吗

  •  
  •   evan0724 · 2021-11-02 14:18:19 +08:00 · 2763 次点击
    这是一个创建于 877 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下

    我现在要定义一个函数,根据入参返回不同的配置,一个比较简单的复现

    type MysqlConfig struct{}
    
    type MongoConfig struct{}
    
    func newCfg(source string) Config{
    
    
    }
    
    

    我现在是把 Config 定义成 type Config map[string]interface{}; 刚开始用 go ,请问有没有比较优雅的实现方式

    14 条回复    2021-11-12 14:35:03 +08:00
    sujin190
        1
    sujin190  
       2021-11-02 14:20:52 +08:00
    声明一个 interface 呗,MysqlConfig 和 MongoConfig 都实现这个接口不就好了
    evan0724
        2
    evan0724  
    OP
       2021-11-02 14:26:30 +08:00
    @sujin190 MysqlConfig 和 MongoConfig 里面的字段是不同的
    sujin190
        3
    sujin190  
       2021-11-02 14:27:54 +08:00
    @evan0724 #2 interface 本来就没要求你两个结构体字段一样啊,要的是都支持相同的操作
    evan0724
        4
    evan0724  
    OP
       2021-11-02 14:29:48 +08:00
    @sujin190 嗯,我看到过这种实现,就是需要在接口里面一如一个方法吧
    hellodudu86
        5
    hellodudu86  
       2021-11-02 14:47:48 +08:00
    package main

    import "fmt"

    type MysqlConfig struct{}

    type MongoConfig struct{}

    func newCfg(source string) interface{} {
    if source == "mysql" {
    return &MysqlConfig{}
    } else {
    return &MongoConfig{}
    }
    }

    func main() {
    mysqlCfg := newCfg("mysql").(*MysqlConfig)
    mongoCfg := newCfg("mongo").(*MongoConfig)
    fmt.Printf("%T\n%T\n", mysqlCfg, mongoCfg)
    }
    evan0724
        6
    evan0724  
    OP
       2021-11-02 14:50:21 +08:00
    @sujin190 确实这种实现比较好,我一开始想错了,谢谢回复
    LoNeFong
        7
    LoNeFong  
       2021-11-02 16:01:21 +08:00
    工厂模式?
    hingbong
        8
    hingbong  
       2021-11-02 17:11:48 +08:00
    等下个版本,用泛型
    XTTX
        9
    XTTX  
       2021-11-03 00:47:03 +08:00
    既然是自己自定义的 config ,完全可以搞一个 DatabaseType , 然后用 if config.Databastype==“mysql”{} else{}....
    XTTX
        10
    XTTX  
       2021-11-03 00:51:23 +08:00
    我好奇什么 app 需要用到两个完全不一样的 db.. controller 的逻辑完全就是两个不同的 app 了。
    evan0724
        11
    evan0724  
    OP
       2021-11-03 11:50:02 +08:00
    @XTTX 做数据同步的,要把配置传给 kafka 的 connector ,每个数据库的配置确实都不一样,controller 会传不同的数据库配置进来,在 controller 层我没想到更好的办法,所以还是用的 map[string]interface{}这样形式来接收数据库配置的
    evan0724
        12
    evan0724  
    OP
       2021-11-03 11:51:00 +08:00
    @hingbong 我们老板等不了=-=
    bitcapybara
        13
    bitcapybara  
       2021-11-07 21:30:17 +08:00
    type Config interface {
    Type() string
    GetMysqlConfig() MysqlConfig
    GetMongoConfig() MongoConfig
    }
    BeijingBaby
        14
    BeijingBaby  
       2021-11-12 14:35:03 +08:00
    直接传 DSN ,传 DSN 就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3118 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:58 · PVG 20:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.