进行转义分析,将 var(s) 声明为指针

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


月关宝盒
浏览 70回答 2
2回答

波斯汪

由于 的地址被发送到一个函数,并且该函数可能会生成在函数返回后可能包含对该函数的引用的 goroutine,因此它被移动到堆中。cscs在第二种情况下, 是指针。没有必要将指针本身移动到堆中,因为函数可以引用的是 指向的对象,而不是本身。您没有显示如何初始化,因此这段代码将失败,但是如果您初始化为指向该函数中声明的变量,则该对象最终可能会出现在堆中。csUnmarshalcscscscs

饮歌长啸

proto.Unmarshalfunc Unmarshal(buf []byte, pb Message)type Message interface {    Reset()    String() string    ProtoMessage()}接口{}可以是每一种类型,在编译过程中很难确定其参数的具体类型,并且还会发生转义。但是如果接口{}是一个指针,它只是一个指针
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go