我有一个结构图,如下所示:

type SocketID string
type Socket struct {
    socket //...
    id     string
}

type Channel struct {
    sync.Mutex
    sockets map[SocketID]Socket
}

我希望能够向其添加子通道,其中每个Socket都属于一个子通道。我尝试将通道结构更改为:
type SubchannelID string
type Channel struct {
    sync.Mutex
    sockets     map[SocketID]Socket
    subchannels map[SubchannelID]map[SocketID]Socket
}

但是我的问题是从Socket中删除Channel成为O(n ^ 2)操作,并且每个套接字在socketssubchannels映射之间重复。在使通道和子通道远离套接字抽象的同时,我该如何优化呢?

最佳答案

没关系,答案最终很简单:

struct Channel {
    sync.Mutex
    sockets     map[SocketID]Socket
    subchannels map[SocketID]SubchannelID
}

func (c Channel) Remove(sid SocketID) {
    c.Lock()
    defer c.Unlock()

    if _, ok := c.sockets[sid]; ok {
        delete(c.sockets, sid)
    }
    if _, ok := c.subchannels[sid]; ok {
        delete(c.subchannels, sid)
    }
}

10-04 17:41