我的消息可以是
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)))
,这似乎不是正确的决定。如何解决这个问题呢?有什么方法可以在这里应用泛型,或者接口是最好的选择吗?
解决此问题的一种方法是更改界面,这样您就可以使用
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
}