我有N个函数返回不同类型的切片。
所有返回的类型都有一个方法:func (t *T)GetName() string
我无法控制这些功能。
现在我尝试将N个功能组合为1:
我创建了一个只有1个方法GetName()
的接口,但出现错误
package main
import (
//"fmt"
)
type A struct{
}
func (a *A) GetName() string {
return "A"
}
type B struct{
}
func (b *B) GetName() string {
return "B"
}
type Alphabet interface{
GetName() string
}
func main() {
}
func returnA() Alphabet{
a := &A{}
return a
}
func returnAs()[]Alphabet{
return []*A{&A{},&A{},&A{}}
}
这里returnA
可以正常工作,但是returnAs会给出编译错误:
prog.go:46:12: cannot use []*A literal (type []*A) as type []Alphabet in return argument
https://play.golang.org/p/ZWUhIg31GE5
更新:
对不起,我没有清楚说明我的情况,
我有N个函数返回不同类型的切片。
我现在使用N个包装函数从原始函数返回值。
我目前拥有的东西:
func returnAs()[]*A{
as := giveMeAs() // giveMeAs() returns []*A
return as
}
func returnBs()[]*B{
bs := giveMeBs() // giveMeBs() returns []*B
return bs
}
我想要什么:
func returnAlphabet(s string)[]Alphabet {
switch s{
case "A":
return giveMeAs()
case "B":
return giveMeBs()
//...
}
}
我不擅长设计模式,我只是觉得这样写对于呼叫者(我自己)来说可能更容易
答案 0 :(得分:4)
您的函数返回一个接口切片,因此您需要构造该接口。你想要的是什么。
func returnAs() []Alphabet {
return []Alphabet{&A{},&A{},&A{}}
}
答案 1 :(得分:1)
func returnAs() (as []Alphabet) {
for _, a := range []*A{&A{},&A{},&A{}} {
as = append(as, a)
}
return
}