Go语言-接口多态;实现接口的类型数组



我来自Java背景,所以我对Go的面向对象方法相当困惑。我试图写一个日志功能,基本上,可以接受数组的一种类型或另一种。澄清一下:数组不会混合类型,它们将是所有类型1或类型2的数组。

我为这两种类型创建了一个接口来实现,但是我的IDE说它不能使用类型作为接口。什么是更好的,更像go的方法?

type Loggable interface {
GetFirstName() string
GetLastName() string
}
type Person1 struct {
FirstName string
LastName string
}
func (t Person1) GetFirstName() string {
return t.FirstName
}
func (t Person1) GetLastName() string {
return t.LastName
}
type Person2 struct {
FirstName2 string
LastName2 string
}
func (t Person2) GetFirstName() string {
return t.FirstName2
}
func (t Person2) GetLastName() string {
return t.LastName2
}
func performLogging(logger LoggingPackage.Logger, loggingList []Loggable){
for _, person := range loggingList {
logger.Logf("Person is %s %s", person.GetFirstName(), person.GetLastName())
}
}
func relevantFunction() {
personList := handler.PersonRequest() // returns an array of all either Person1, or all Person2
performLogging(logger, personList) // can't use []Person1 or []Person2 as []Loggable
}```

我发现在这些情况下,去掉所有不是核心的代码是有帮助的问题。这个例子如预期的那样工作:

package main
import "fmt"
type Loggable interface {
GetFirstName() string
}
type Person1 struct { FirstName string }
func (t Person1) GetFirstName() string { return t.FirstName }
type Person2 struct { FirstName2 string }
func (t Person2) GetFirstName() string { return t.FirstName2 }
func performLogging(loggingList []Loggable){
for _, person := range loggingList {
fmt.Println(person.GetFirstName())
}
}
func main() {
people := []Loggable{
Person1{"Angela"}, Person2{"Tyrell"},
}
performLogging(people)
}

最新更新