我有一个结构图,如下所示:
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)操作,并且每个套接字在sockets
和subchannels
映射之间重复。在使通道和子通道远离套接字抽象的同时,我该如何优化呢? 最佳答案
没关系,答案最终很简单:
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)
}
}