我可以编写一个采用参数类型parentStruc的函数,以便我可以传递任何“派生”类型吗?

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

首先,我知道 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
,否则我无法编译。

go inheritance websocket
1个回答
0
投票

使用界面:

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
方法的东西都可以传递给您的函数。

© www.soinside.com 2019 - 2024. All rights reserved.