func main() { var cs CustomStruct r := []byte{.......} err:=proto.Unmarshal(r, &cs) if err!=nil { panic(err) } }当我跑步时,我得到go build -gcflags="-m" ./... 已移至堆:自定义结构但是,通过一个小的更改,它不会移动到堆中:func main() { var cs *CustomStruct r := []byte{.......} err:=proto.Unmarshal(r, cs) if err!=nil { panic(err) } }现在,当我运行转义分析命令时,它并没有说它被移动到堆中。这到底是怎么回事?CustomStruct
2 回答
波斯汪
TA贡献1811条经验 获得超4个赞
由于 的地址被发送到一个函数,并且该函数可能会生成在函数返回后可能包含对该函数的引用的 goroutine,因此它被移动到堆中。cs
cs
在第二种情况下, 是指针。没有必要将指针本身移动到堆中,因为函数可以引用的是 指向的对象,而不是本身。您没有显示如何初始化,因此这段代码将失败,但是如果您初始化为指向该函数中声明的变量,则该对象最终可能会出现在堆中。cs
Unmarshal
cs
cs
cs
cs
饮歌长啸
TA贡献1951条经验 获得超3个赞
proto.Unmarshal
func Unmarshal(buf []byte, pb Message)
type Message interface {
Reset()
String() string
ProtoMessage()
}
接口{}可以是每一种类型,在编译过程中很难确定其参数的具体类型,并且还会发生转义。
但是如果接口{}是一个指针,它只是一个指针
- 2 回答
- 0 关注
- 69 浏览
添加回答
举报
0/150
提交
取消