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

2021-11-02 14:18:19 +08:00
 evan0724

如下

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

type MysqlConfig struct{}

type MongoConfig struct{}

func newCfg(source string) Config{


}

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

2800 次点击
所在节点    Go 编程语言
14 条回复
sujin190
2021-11-02 14:20:52 +08:00
声明一个 interface 呗,MysqlConfig 和 MongoConfig 都实现这个接口不就好了
evan0724
2021-11-02 14:26:30 +08:00
@sujin190 MysqlConfig 和 MongoConfig 里面的字段是不同的
sujin190
2021-11-02 14:27:54 +08:00
@evan0724 #2 interface 本来就没要求你两个结构体字段一样啊,要的是都支持相同的操作
evan0724
2021-11-02 14:29:48 +08:00
@sujin190 嗯,我看到过这种实现,就是需要在接口里面一如一个方法吧
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
2021-11-02 14:50:21 +08:00
@sujin190 确实这种实现比较好,我一开始想错了,谢谢回复
LoNeFong
2021-11-02 16:01:21 +08:00
工厂模式?
hingbong
2021-11-02 17:11:48 +08:00
等下个版本,用泛型
XTTX
2021-11-03 00:47:03 +08:00
既然是自己自定义的 config ,完全可以搞一个 DatabaseType , 然后用 if config.Databastype==“mysql”{} else{}....
XTTX
2021-11-03 00:51:23 +08:00
我好奇什么 app 需要用到两个完全不一样的 db.. controller 的逻辑完全就是两个不同的 app 了。
evan0724
2021-11-03 11:50:02 +08:00
@XTTX 做数据同步的,要把配置传给 kafka 的 connector ,每个数据库的配置确实都不一样,controller 会传不同的数据库配置进来,在 controller 层我没想到更好的办法,所以还是用的 map[string]interface{}这样形式来接收数据库配置的
evan0724
2021-11-03 11:51:00 +08:00
@hingbong 我们老板等不了=-=
bitcapybara
2021-11-07 21:30:17 +08:00
type Config interface {
Type() string
GetMysqlConfig() MysqlConfig
GetMongoConfig() MongoConfig
}
BeijingBaby
2021-11-12 14:35:03 +08:00
直接传 DSN ,传 DSN 就行了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/812453

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX