diff --git a/internal/discovery/model.go b/internal/discovery/model.go index 4d8245e..6460644 100644 --- a/internal/discovery/model.go +++ b/internal/discovery/model.go @@ -61,3 +61,20 @@ func (p *PresencePacket) SignPayload() []byte { // 格式: id|name|port|os|pk return fmt.Appendf(nil, "%s|%s|%d|%s|%s", p.ID, p.Name, p.Port, p.OS, p.PublicKey) } + +// DeepCopy 返回 Peer 的深拷贝 +func (p Peer) DeepCopy() *Peer { + newPeer := p // 结构体浅拷贝 (值类型字段已复制) + + // 手动深拷贝引用类型字段 (Routes) + if p.Routes != nil { + newPeer.Routes = make(map[string]*RouteState, len(p.Routes)) + for k, v := range p.Routes { + // RouteState 只有值类型字段,但它是指针,所以需要新建对象并解引用赋值 + stateCopy := *v + newPeer.Routes[k] = &stateCopy + } + } + + return &newPeer +} diff --git a/internal/discovery/service.go b/internal/discovery/service.go index 0da84a6..1eef246 100644 --- a/internal/discovery/service.go +++ b/internal/discovery/service.go @@ -337,7 +337,7 @@ func (s *Service) GetPeerByIP(ip string) (*Peer, bool) { for _, p := range s.peers { if p.Routes[ip] != nil { - return p, true + return p.DeepCopy(), true } } return nil, false @@ -348,7 +348,10 @@ func (s *Service) GetPeerByID(id string) (*Peer, bool) { defer s.peersMutex.RUnlock() peer, ok := s.peers[id] - return peer, ok + if !ok { + return nil, false + } + return peer.DeepCopy(), true } func (s *Service) GetPeers() []Peer { @@ -357,7 +360,7 @@ func (s *Service) GetPeers() []Peer { list := make([]Peer, 0) for _, p := range s.peers { - list = append(list, *p) + list = append(list, *p.DeepCopy()) } sort.Slice(list, func(i, j int) bool { return list[i].Name < list[j].Name