我现在要定义一个函数,根据入参返回不同的配置,一个比较简单的复现
type MysqlConfig struct{} type MongoConfig struct{} func newCfg(source string) Config{ }
我现在是把 Config 定义成 type Config map[string]interface{}; 刚开始用 go ,请问有没有比较优雅的实现方式
![]() | 1 sujin190 2021-11-02 14:20:52 +08:00 声明一个 interface 呗,MysqlConfig 和 MongoConfig 都实现这个接口不就好了 |
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) } |
7 LoNeFong 2021-11-02 16:01:21 +08:00 工厂模式? |
8 hingbong 2021-11-02 17:11:48 +08:00 等下个版本,用泛型 |
![]() | 9 XTTX 2021-11-03 00:47:03 +08:00 既然是自己自定义的 config ,完全可以搞一个 DatabaseType , 然后用 if config.Databastype==“mysql”{} else{}.... |
![]() | 10 XTTX 2021-11-03 00:51:23 +08:00 我好奇什么 app 需要用到两个完全不一样的 db.. controller 的逻辑完全就是两个不同的 app 了。 |
11 evan0724 OP @XTTX 做数据同步的,要把配置传给 kafka 的 connector ,每个数据库的配置确实都不一样,controller 会传不同的数据库配置进来,在 controller 层我没想到更好的办法,所以还是用的 map[string]interface{}这样形式来接收数据库配置的 |
13 bitcapybara 2021-11-07 21:30:17 +08:00 type Config interface { Type() string GetMysqlConfig() MysqlConfig GetMongoConfig() MongoConfig } |
![]() | 14 BeijingBaby 2021-11-12 14:35:03 +08:00 直接传 DSN ,传 DSN 就行了。 |