go的方法可以直接返回局部變量的指針泥耀,這主要依賴go是有runtime的語言,編譯器在發(fā)現(xiàn)有變量可以逃逸出去的時(shí)候會(huì)在堆上分配變量而不是棧上樊展,這樣就可以返回該變量的指針了应结,且會(huì)使該地址的引用+1,當(dāng)生命空間結(jié)束時(shí)虐译,gc會(huì)去回收瘪板。
package main
import "fmt"
func test() *int {
var inner int = 100
return &inner
}
func main() {
outer := test()
fmt.Println(outer, *outer)
}
作為對比,C語言就完全需要程序員自己去控制內(nèi)存了漆诽,如果需要從函數(shù)內(nèi)部返回指針侮攀,那么需要程序員自己malloc在堆上分配空間,并且需要在外部使用者用完之后即使的free掉厢拭。如果直接像go那樣返回指針兰英,要么編譯不過,要么也是返回一個(gè)已經(jīng)不該使用的棧內(nèi)存地址蚪腐,使用該地址會(huì)造成嚴(yán)重的錯(cuò)誤箭昵。