Heim >Backend-Entwicklung >Golang >Warum hat GOLANG immer noch Hinweise?

Warum hat GOLANG immer noch Hinweise?

(*-*)浩
(*-*)浩Original
2019-12-31 10:48:563903Durchsuche

Warum hat GOLANG immer noch Hinweise?

Warum braucht Golang also Hinweise? Welche einzigartigen Verwendungszwecke kann diese Art von Zeiger haben? (Empfohlenes Lernen: GO )

Beim Erlernen der Typsprache immer zuerst herausfinden, wann eine Funktion/Methode übergeben wird Ist es ein Wert oder eine Referenz?

Tatsächlich handelt es sich bei den meisten Referenzsprachen, wenn die Parameter vom Basistyp sind, bei den meisten übergebenen Werten um Werte, was bedeutet, dass eine weitere Kopie der Parameter in den aktuellen Funktionsaufrufstapel kopiert wird. Wenn es sich bei den Parametern um erweiterte Typen handelt, sind grundsätzlich alle übergebenen Parameter Referenzen. Dies wird hauptsächlich durch die Speicherverwaltung der virtuellen Maschine verursacht.

Der Speicherbereich in der Speicherverwaltung umfasst im Allgemeinen Heap und Stack. Der Stapel wird hauptsächlich zum Speichern einfacher Typdaten verwendet, die im aktuellen Aufrufstapel verwendet werden: Zeichenfolge, Boolescher Wert, Int, Float usw.

Diese Speichertypen belegen nur wenig und sind leicht zu recyceln. Im Grunde ähneln ihre Werte dem von Zeigern belegten Platz, sodass sie direkt kopiert werden können, was für GC einfacher ist um gezielte Optimierungen durchzuführen.

Komplexe erweiterte Typen belegen in der Regel relativ viel Speicher und werden im Heap gespeichert. Die Häufigkeit des GC-Recyclings ist relativ gering und die Kosten sind hoch. Daher können durch die Übergabe von Referenzen/Zeigern kostspielige Vorgänge vermieden werden . Kopieren Sie Vorgänge, sparen Sie Speicher und verbessern Sie die Effizienz der Programmausführung.

Daher können Sie die Verwendung von Zeigern in folgenden Situationen in Betracht ziehen: 1. Der Wert eines Parameters muss geändert werden. 2. Vermeiden Sie Kopiervorgänge.

In Golang unterscheiden sich insbesondere auch erweiterte Typen wie Struktur, Slice und Karte. Tatsächlich ist nur die Verwendung von Struktur etwas kompliziert. Sie können alle direkt verwendet werden, ohne zu berücksichtigen, ob es sich um Werte oder Zeiger handelt.

Go hat Zeiger, aber keine Zeigerarithmetik. Sie können keine Zeigervariablen verwenden, um die Bytes einer Zeichenfolge zu durchlaufen. Denken Sie beim Aufrufen von Funktionen in Go daran, dass Variablen als Wert übergeben werden.

Definiert einen Zeiger „*“, indem ihm der Typ „var p * int“ vorangestellt wird. Nun ist p ein Zeiger auf einen ganzzahligen Wert. Allen neu definierten Variablen wird der Nullwert ihres Typs zugewiesen, dasselbe gilt für Zeiger. Ein neu definierter Zeiger oder Zeiger, der auf nichts zeigt, hat den Wert Null.

In anderen Sprachen wird dies oft als NULL-Zeiger bezeichnet, in Go ist es nil . Um den Zeiger auf etwas zeigen zu lassen, können Sie den Adressoperator (&) wie folgt verwenden:

package main 
 
import "fmt"
 
func main() {
    var p *int 
    fmt.Printf("%v\n",p) //← 打印 nil
 
    var i int //← 定义一个整形变量 i
    p = &i    //← 使得 p 指向 i, 获取 i 的地址
    fmt.Printf("%v\n",p) //打印内存地址
 
    *p = 6
    fmt.Printf("%v\n",*p) //打印6
    fmt.Printf("%v\n",i) //打印6
 
}

Wie bereits erwähnt, gibt es keine Zeigerarithmetik. Wenn Sie also so schreiben: *p++, bedeutet das (*p) ++: Rufen Sie zuerst den Wert ab, auf den der Zeiger zeigt, und fügen Sie dann eins zu diesem Wert hinzu. Beachten Sie hier den Unterschied zur C-Sprache.

Für die Go-Sprache gibt es streng genommen nur eine Art der Übertragung, nämlich die Wertübertragung. Wenn eine Variable als Parameter übergeben wird, wird eine Kopie der Variablen erstellt und dann an die Funktion oder Methode übergeben. Sie können sehen, dass sich die Adresse dieser Kopie von der Adresse der Variablen unterscheidet.

Wenn eine Variable als Zeiger übergeben wird, wird ein neuer Zeiger erstellt, der auf dieselbe Speicheradresse zeigt, auf die die Variable zeigt. Sie können sich diesen Zeiger also als eine Kopie des ursprünglichen Variablenzeigers vorstellen.

Wenn wir es so verstehen, können wir verstehen, dass Go immer eine Kopie erstellt und sie nach Wert überträgt, aber diese Kopie ist manchmal eine Kopie der Variablen und manchmal eine Kopie des Variablenzeigers.

Das obige ist der detaillierte Inhalt vonWarum hat GOLANG immer noch Hinweise?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn