2016-07-06 15 views
9

In C, wenn ich einen Zeiger einer stack-created-Variable von einer Funktion zurückgeben, wird der Speicher nach der Funktion zurückgegeben, so dass der Zeiger unmöglich dereferenziert werden kann. Aber in Go gibt der Compiler mir keine Fehler. Bedeutet das, dass dies sicher ist?Go - Zurückgeben eines Zeigers auf Stapel

package main 

import (
    "fmt" 
) 

func main() { 
    fmt.Println(*(something())) 
} 

func something() *string { 
    s := "a" 
    return &s 
} 

Antwort

10

Ja, das ist sicher und ein normales Muster in Go-Programmierung. Go verwendet escape analysis, um beliebige Werte mit Zeigern zu verschieben, die den Stapel automatisch in den Heapspeicher auslagern. Sie müssen sich nicht darum kümmern, wo Werte zugewiesen werden.

Vom Go FAQ: "How do I know whether a variable is allocated on the heap or the stack?"

wenn der Compiler, dass die Variable nicht beweisen kann nicht nach dem die Funktion zurückkehrt referenziert wird, dann wird der Compiler die Variable auf der Garbage Collection Heap reservieren müssen baumelt Zeiger Fehler zu vermeiden

Sie können diese Optimierungsoptionen während der Kompilierung mithilfe der Option -gcflags -m anzeigen.

3

Ja, in Golang ist es in Ordnung, einen Zeiger auf eine lokale Variable zurückzugeben. Golang verwaltet die für Sie lebenslangen Objekte und gibt sie frei, wenn alle Zeiger darauf verschwunden sind.

In einer anderen Antwort zeige ich alle Unterschiede zwischen C/C++ - Zeiger und Golang-Zeiger: What is the meaning of '*' and '&' in Golang?