如何避免重复类似功能N次

时间:2019-04-19 03:38:04

标签: go

我有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()
   //...
   }
}

我不擅长设计模式,我只是觉得这样写对于呼叫者(我自己)来说可能更容易

2 个答案:

答案 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 
}

https://play.golang.org/p/s3Y4ccZIeYr