最近在给一个 HTTP 服务写 SDK,这个 HTTP 服务的响应是下面这种经典格式:
{
"cdoe": 0,
"msg": "ok",
"data": {}
}
那么在 Go 里定义结构体的时候就会长这样:
type Custom struct {
// ...
}
type SomeResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data Custom `json:"data"`
}
相应的方法会长这样:
SomeService(ctx context.Context, param any) (*Custom, error)
因为 Custom
的内部可能会有很多数据,所以是以指针作为返回值的,尽量避免数据拷贝;而 Code != 0
这种情况就通过 error
返回。
内部实现大概会是这样:
func (s SDK) SomeService(ctx context.Context, param any) (*Custom, error) {
var resp SomeResponse
err := s.request(ctx, "/someservice", param, &resp)
if err != nil {
return nil, err
}
if resp.Code != 0 {
return nil, fmt.Errorf("code: %d, err: %s", resp.Code, resp.Msg)
}
return &resp.Data, nil
}
通常我们到这一步就算是完成任务了,但是这时候我想了下:return 之后,GC 是怎么回收 resp
的呢?是会把 resp.Code
和 resp.Msg
的内存回收了,只让 resp.Data
逃逸吗?
这个问题不算复杂,动手做个实验就知道了。先把上面的代码简化一下:
阅读剩余部分