如何在接口中使用泛型并作为函数参数

问题描述 投票:0回答:1

我的消息可以是

string
slice
。我想将它们与一个接口结合起来,以便下面编写的函数可以工作(也许它们需要重写)。但我不明白要指定哪种类型。

type Message interface {
    GetMessage() ?
}

type StringMessage struct {
    message string
}

func (m *StringMessage) GetMessage() ? {
    return m.message
}

type SliceMessage struct {
    message []string
}

func (m *SliceMessage) GetMessage() ? {
    return m.message
}

type Sender interface {
    Send(m []Message)
}

type StringSender struct{}

func (s *StringSender) Send(m []Message) {
    var res [][]byte = make([][]byte, 0, len(m))
    for _, message := range m {
        res = append(res, []byte(message.GetMessage()))
    }
    //do something
}

type SliceSender struct{}

func (s *SliceSender) Send(m []Message) {
    var res = make([]string, 0)
    for _, message := range m {
        res = append(res, message.GetMessage()...)
    }
    //do something
}

// There is always only one type of message in a slice.
func PrepareMessages(m []Message) []string {
    var res = make([]string, 0)
    for _, message := range m {
        switch mes := message.(type) {
        case StringMessage:
            res = append(res, mes.GetMessage())
        case SliceMessage:
            res = append(res, mes.GetMessage()...)
        }
    }
    return res
}

我尝试使用该界面,但我需要投射

res = append(res, []byte(message.GetMessage().(string)))
,这似乎不是正确的决定。如何解决这个问题呢?有什么方法可以在这里应用泛型,或者接口是最好的选择吗?

go generics
1个回答
0
投票

解决此问题的一种方法是更改界面,这样您就可以使用

GetMessage
方法来代替
PrepareMessage

func (m StringMessage) PrepareMessage(input []string) []string {
  return append(input, m.msg)
}

func (m SliceMessage) PrepareMessage(input []string) []string {
  return append(input,m.msg...)
}

然后你可以简单地做:

func PrepareMessages(m []Message) []string {
    var res = make([]string, 0)
    for _, message := range m {
        res=message.PrepareMessage(res)
    }
    return res
}
© www.soinside.com 2019 - 2024. All rights reserved.