英文:
Golang generic return type on a method
问题
我是你的中文翻译助手,以下是翻译好的内容:
我对golang还不熟悉,我在努力弄清楚如何在方法上实现一些通用行为。
func (s *service) getCars(filter Filter) ([]car, error){
var err error
var cars []car
switch filter {
case filter.Toyota:
cars, err = s.dbClient.getToyotas()
case filter.Honda:
cars, err = s.dbClient.getHondas()
}
return cars, nil
}
从s.dbClient.getToyotas()和s.dbClient.getHondas()返回的对象是具有相同字段但类型不同的数据结构。我应该注意到这些返回的结构体是自动生成的,所以我无法修改它们。
看起来go接口只允许方法,而不是数据字段,所以我不知道是否可以定义一个作为返回类型的car
类型。我也看了泛型,但似乎在结构体方法上不允许使用泛型。
在go中,如何以惯用的方式实现这样的功能?
英文:
I'm new to golang, and I'm struggling to see how I can get some generic behavior on a method.
func (s *service) getCars(filter Filter) ([]car, error){
var err error
var cars []car
switch filter {
case filter.Toyota:
cars, err = s.dbClient.getToyotas()
case filter.Honda:
cars, err = s.dbClient.getHondas()
}
return cars, nil
}
The objects returned from s.dbClient.getToyotas() and s.dbClient.getHondas() are data structs with the same fields, but have different types. I should note these returned structs are auto generated, so I don't have the ability to alter them.
It looks like go interfaces only allow methods, and not data fields, so I don't if it's even possible to define a car
type that can be used as the return type. I looked at generics as well, but it seems that generics are not allowed on struct methods.
What's the idiomatic way of doing something like this in go?
答案1
得分: 2
定义一个通用接口是一种惯用的方法。
通过在接口上定义访问器方法,可以对字段进行“建模”,然后在特定的结构体上实现这些方法。
实际上,这是一个更好的解决方案,因为这些方法可以做更多的事情,而不仅仅是简单地访问内部的私有变量。例如,它们可以具有延迟初始化或缓存访问的功能。每个结构体可以有独特的实现,或者你可以有一个带有默认实现的基础结构体。
英文:
Defining a common interface is the idiomatic way to go.
Access to fields can be "modeled" by defining accessor methods on interface and then implementing those on specific structs.
In fact, it is a better solution as those methods can do more than simple access to internal, private variables. For example, they can have lazy initialization or cached access built in. Each struct can have unique implementation or you can have a base struct with default one.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论