首先,我知道 Go 不像其他语言那样进行类继承。
话虽这么说,我正在尝试为我的 WebSocket 实现编写一个“广播”函数,它本身应该非常简单......
type B struct {
A
myProp string
}
type A struct {
Id string
}
func broadcastMessage(broadcastChan can []byte, broadcastData A) {
msg, err := json.Marshal(broadcastData)
if err != nil {
log.Printf("websocket marshal error: %v", err)
return
}
broadcastChan <- msg
}
这尤其令人沮丧,因为函数逻辑与
broadcastData
的结构完全不可知。
这里有没有好的方法来强制执行某种类型安全?我不想将参数保留为
any
。
func broadcastMessage(broadcastChan chan []byte, broadcastData any) {
// implementation is exactly the same
}
我被迫将第二个参数定义为
any
,否则我无法编译。
使用界面:
type BroadcastPayload interface {
ID() string
}
type A struct {
Id string
}
func (a A) ID() string {return a.Id}
func broadcastMessage(broadcastChan can []byte, broadcastData BroadcastPayload) {
...
}
上面的实现接受 A 和任何嵌入 A 的东西。它还引入了一个
ID() string
方法。您可以用标记方法替换它,该方法的唯一作用是将某些内容标记为合适的有效负载。也就是说,除了上述之外,您还可以:
type BroadcastPayload interface {
IsBroadcastPayload()
}
type A struct {
Id string
}
func (A) IsBroadcastPayload() {}
在这里,任何实现
IsBroadcastPayload
方法的东西都可以传递给您的函数。