Golang Go语言中一个函数返回不同的结构体有比较优雅的实现吗

Golang Go语言中一个函数返回不同的结构体有比较优雅的实现吗

如下

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

type MysqlConfig struct{}

type MongoConfig struct{}

func newCfg(source string) Config{

}

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


更多关于Golang Go语言中一个函数返回不同的结构体有比较优雅的实现吗的实战教程也可以访问 https://www.itying.com/category-94-b0.html

15 回复

声明一个 interface 呗,MysqlConfig 和 MongoConfig 都实现这个接口不就好了

更多关于Golang Go语言中一个函数返回不同的结构体有比较优雅的实现吗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


MysqlConfig 和 MongoConfig 里面的字段是不同的

#2 interface 本来就没要求你两个结构体字段一样啊,要的是都支持相同的操作

嗯,我看到过这种实现,就是需要在接口里面一如一个方法吧

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)
}

确实这种实现比较好,我一开始想错了,谢谢回复

工厂模式?

等下个版本,用泛型

既然是自己自定义的 config ,完全可以搞一个 DatabaseType , 然后用 if config.Databastype==“mysql”{} else{}…

我好奇什么 app 需要用到两个完全不一样的 db… controller 的逻辑完全就是两个不同的 app 了。

做数据同步的,要把配置传给 kafka 的 connector ,每个数据库的配置确实都不一样,controller 会传不同的数据库配置进来,在 controller 层我没想到更好的办法,所以还是用的 map[string]interface{}这样形式来接收数据库配置的

我们老板等不了=-=

type Config interface {
Type() string
GetMysqlConfig() MysqlConfig
GetMongoConfig() MongoConfig
}

直接传 DSN ,传 DSN 就行了。

在Go语言中,实现一个函数返回不同的结构体,确实可以通过多种方式来实现,以下是一些较为优雅的方法:

  1. 使用接口:定义一个公共接口,让不同的结构体实现这个接口。函数返回这个接口类型,从而可以返回多种结构体。这种方法的好处是提高了代码的灵活性和可扩展性。例如:
type Result interface {
    Display()
}

type StructA struct{}

func (a StructA) Display() {
    fmt.Println("StructA")
}

type StructB struct{}

func (b StructB) Display() {
    fmt.Println("StructB")
}

func GetResult() Result {
    // 根据某些条件返回 StructA 或 StructB 的实例
    return StructA{}
}
  1. 使用空接口和类型断言:函数返回空接口interface{},调用者使用类型断言来处理具体的返回类型。这种方法虽然灵活,但牺牲了类型安全性,需要更多的运行时检查。

  2. 使用指针和nil:如果函数可能返回多种结构体且这些结构体有共同的字段,可以考虑定义一个包含这些共同字段的基础结构体,并让其他结构体嵌入这个基础结构体。函数返回基础结构体的指针,并根据需要将其指向具体的结构体实例或设置为nil。

综上所述,使用接口是最推荐的方法,因为它能在编译时提供类型安全,同时保持代码的灵活性和可扩展性。在设计接口时,要确保接口的定义足够通用,以容纳未来可能的扩展。

回到顶部