net / rpc包中的RPC服务器为Request结构和Response结构保存两个空闲列表。 Request struct通过其下一个字段维护此列表。
// Server表示RPC服务器。类型服务器…
freelist的想法是通过重用已经创建的对象实例来减少动态内存分配的数量。
它的工作原理如下:
当第一个请求发出时,freelist为空,因此将在堆上分配新的结构。当不再需要它们时,将它们放入空闲列表中以便重复使用。如果您没有freelist,那么下一个请求将需要在堆上创建新的Request / Response结构,这可能需要重复进行反复操作。使用空闲列表可以避免这种情况,因为下一个请求可以简单地重用已经分配的(和停放的)对象。
我想你对这一行感到困惑:
*req = Request{}
反对freelist为空并且在堆上创建新对象的情况 req = new(Request) ,这不会在堆上分配对象。
req = new(Request)
它只是通过复制默认值将已分配的对象(从空闲列表中取消)重置为默认状态。
您可以将该行分解为以下内容:
r := Request{} // Create a request with default content on stack (not heap!) *req = r // Copy all fields from default request to req
无论采取何种方式 getRequest() ,它总是返回一个默认的初始化请求对象 - 没有上一个请求的剩余部分。
getRequest()