Golang Go语言中如何做到“读不同的配置,加载不同的类”
python 的逻辑大致如下,但在 go 中不知道怎么做
class A(object):
def run(self):
pass
class B(object):
def run(self):
pass
all_classes = {“a”: A, “b”: B}
for class_type, args in read_config(“config_file”):
instance = all_classesclass_type
# 或者
instance = getattr(sys.modules[name], class_type.upper())
instance.run()
现在能想到的就是写一堆的 if else,然后返回一个 interface{},有更合理的方式吗?
func LoadClass(class_type string, args map[string]string) interface{} {
if class_type == "a" {
...
} else if ...
}
Golang Go语言中如何做到“读不同的配置,加载不同的类”
更多关于Golang Go语言中如何做到“读不同的配置,加载不同的类”的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可能我理解有误,我要的是 map 里能存 struct 的类,而不是 struct 的实例
写一个 newstruct 方法,用 map string func 存起来。
感觉应该从需求上去重新考虑一下。
如果 A 和 B 完全没任何关系,为什么要这样写?如果两者很类似,是不是有更好的数据结构?
定义一个接口 Runner 里面有一个方法 run,让不同的 struct 去实现 Runner 然后 loadclass 返回 Runner
map 里存 factory 函数.
Go 不能通过一个字符串反射出一个对象,所以先要将一个 struct 的构造方式注册。
我们用的是 Model 接口有一个 New 方法,直接返回 new(Model),注册 model 到 factory,然后 factory 通过字符串返回 model 实例。
目前就是按 type Runner interface{}这种方式做的,但不知道怎么返回一个 default 的空 interface,只能极其愚蠢的又实现了一个 type RunDefault struct {}
那不可能啊 你定义的不是空接口肯定没法返回默认非空
注册 model 到 factory,这点能说详细点,或者给个示例代码吗?
你姿势不对。
new 一个空的 model。。这一步是没法省的。
简单点就是用 map
复杂点就上设计模式。
你的思路不对,go 里不是这么考虑问题的,我提几个提示。
1、golang 不是面向对象的语言,不要套用面向对象语言的设计模式。
2、golang 如果想要实现类似根据不同的类实现多个逻辑的需求,你需要把它转换成结构体来考虑。
3、func 在 golang 里是一等结构,因此结构体上可以有一些成员,这些成员的类型,是特定类型的 func。
4、读取配置文件后,如果是 A 情况,则把该成员赋值为方法 A,如果是 B 情况,则把该成员赋值为方法 B。
接上条,手滑发出去了……
5、这样实例 A 的 run 方法和实例 B 的 run 方法就可以实现不同的逻辑。
伪代码举例如下:<br>type Person Struct {<br> name string<br> tell func()(xxx)<br>}<br><br><br><br>zhangxiaojie = Person{ "baohua", func()(xxx) { fmt.println("Mr. dong lianren ? ") } }<br>jiangxiansheng = Person { "takumin", func()(xxx) { fmt.println("Hou wa! ") }}<br><br><br>zhangxiaojie.tell()<br>jiangxiansheng.tell()<br>
这样两个人都是 person 实例,但 tell 方法的逻辑是不同的,不需要在方法逻辑里面来暴力 if else。
在Golang(Go语言)中,实现“读不同的配置,加载不同的类”的功能,通常涉及配置文件的读取、反射机制(reflection)或接口实现等技巧。以下是一个基本思路:
-
配置文件读取:首先,你需要从配置文件(如JSON、YAML等)中读取不同的配置。Go语言的标准库
encoding/json
和gopkg.in/yaml.v2
等包可以帮助你解析这些配置文件。 -
定义接口:定义一个通用的接口,所有可能的“类”都需要实现这个接口。这样,你就可以通过接口来引用不同的实现。
-
工厂模式:使用工厂函数或方法,根据配置信息返回不同的接口实现。工厂函数可以读取配置中的某个字段,然后根据该字段的值决定返回哪个具体的实现。
-
使用反射(可选):如果配置文件中直接指定了类名或其他标识符,你可以使用反射机制来动态创建实例。但通常,使用接口和工厂模式已经足够灵活,且代码更易读、易维护。
-
依赖注入:在一些复杂的应用中,你还可以考虑使用依赖注入框架(如Uber的Dig或Facebook的Wire)来管理不同配置下的类加载。
通过上述步骤,你可以实现根据不同配置加载不同“类”的功能,从而提高代码的灵活性和可维护性。在实际项目中,还需要考虑配置的热加载、错误处理以及性能优化等问题。