- 源码位置 net/rpc/server.go
数据结构
// Server represents an RPC Server.
type Server struct {
serviceMap sync.Map // map[string]*service
reqLock sync.Mutex // protects freeReq
freeReq *Request
respLock sync.Mutex // protects freeResp
freeResp *Response
}
// 成员函数
func (server *Server)freeRequest(req *Request)
func (server *Server)getRequest() *Request {
server.reqLock.Lock()
req := server.freeReq
if req == nil {
req =new(Request)
}else {
server.freeReq = req.next
//错误, 此处新建了Request,取代了req原始指向的对象, 应该删除此行,直接返回req, 达到Request对象复用的效果
*req =Request{}
}
server.reqLock.Unlock()
return req
}
在结构体Server中维护了freeReq, freeResp链表,用于复用request和response。 但是在getRequest函数里, 源码中将freeReq头节点指向第二个节点, 并新建了一个Request{}作为结果返回。正确的做法应该是将头节点从链表中删除,然后将头节点返回,从而达到对象复用的效果。
有疑问加站长微信联系(非本文作者)