Heim  >  Artikel  >  Backend-Entwicklung  >  Informationen zum Verständnis des Golang-Zeigers

Informationen zum Verständnis des Golang-Zeigers

藏色散人
藏色散人nach vorne
2020-11-05 15:36:241930Durchsuche

Die folgende Kolumne führt Sie in das Verständnis des Golang-Zeigers aus der Kolumne Golang-Tutorial ein. Ich hoffe, dass es für Freunde hilfreich ist, die es brauchen!

Informationen zum Verständnis des Golang-Zeigers

0x00 Zeigeradresse und Zeigertyp

Eine Variable entspricht einem Speicherplatz, der den Wert des entsprechenden Typs der Variablen speichern kann zeigen Sie auf die Speicheradresse eines beliebigen Werts.

Erhalten Sie das Adresssymbol &. &
在指针类型前加上 * 号,可以获取指针所指向的内容,它是一个类型更改器,使用一个指针引用一个值称为间接引用。

prt := &v    // v 的类型为T

v 表示被取地址的变量,prt 接收 v 的地址,prt 的类型为 *T,称为 T 的指针类型。

0x01 从指针获取指针指向的值

使用 & 对变量进行取地址之后,获得这个变量的指针,可以对指针使用 * 号来获取这个指针指向的值,称为指针取值。

temp := "test content"
prt := &temp
fmt.Println(*prt)   // 打印 test content

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

对变量进行取地址(&)操作,可以获得这个变量的指针变量。
指针变量的值是指针地址。
对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

0x02 使用指针修改值

使用 * 对指针指向的值进行修改和操作

x, y := 1, 2
fmt.Println(x, y)  // 1 2
j, k := &x, &y
*j, *k = *k, *j
fmt.Println(x, y)  // 2 1

*Fügen Sie * vor dem Zeigertyp hinzu, um den Inhalt zu erhalten, auf den der Zeiger zeigt. Es handelt sich um einen Typwechsler, der einen Zeiger verwendet, um auf einen zu verweisen Der Wert wird als indirekte Referenz bezeichnet.

x, y := 1, 2
fmt.Println(x, y)  // 1 2
j, k := &x, &y
j, k = k, j
fmt.Println(x, y)    // 1 2
fmt.Printf("x : %p, y :  %p \n", &x, &y)  // x : 0xc00001a088, y :  0xc00001a090
fmt.Printf("j : %p, y :  %p \n", j, k)  //j : 0xc00001a090, y :  0xc00001a088
v stellt die Variable dar, deren Adresse prt die Adresse von v erhält > ist *T, ein Zeigertyp namens T.

0x01 Rufen Sie den Wert ab, auf den der Zeiger zeigt.

Nachdem Sie & verwendet haben, um die Adresse der Variablen abzurufen, können Sie den Zeiger dieser Variablen abrufen Das Symbol >* für den Zeiger wird als Zeigerwerterfassung bezeichnet.

var p = f()

func f() *int {
    v := 1
    return &v
}
Die Beziehungen und Eigenschaften von Variablen, Zeigeradressen, Zeigervariablen, Adressen und Werten sind wie folgt:

Führen Sie die Adressoperation (&) für eine Variable aus, um die Zeigervariable dieser Variablen zu erhalten.
Der Wert einer Zeigervariablen ist die Zeigeradresse.

Führen Sie die Wertoperation (*) für die Zeigervariable aus, um den Wert der ursprünglichen Variablen zu erhalten, auf die die Zeigervariable zeigt.

0x02 Verwenden Sie Zeiger, um Werte zu ändern

Verwenden Sie *, um den Wert zu ändern und zu bedienen, auf den der Zeiger zeigt.

	temp := new(int)
	*temp = 123
	fmt.Println(*temp)  // 123
	fmt.Println(temp)  //  0xaabb

* Die grundlegende Bedeutung Der Operator besteht darin, den Zeiger zu bedienen. Die Variable, auf die gezeigt wird. Wenn sich die Operation auf einen R-Wert bezieht, nimmt sie den Wert der Variablen an, auf die gezeigt wird; wenn die Operation auf einen L-Wert angewendet wird, setzt sie den Wert auf die Variable, auf die gezeigt wird.

🎜Wenn Sie nur referenzierte Zeiger austauschen, sind die referenzierten Variablen, Werte und Adressen nicht betroffen, sondern nur die Anwendungszeiger. 🎜
package main

import (
    "flag"
    "fmt"
    "strings"
)

var n = flag.Bool("n", true, "print test")
var sep = flag.String("s", " ", "separator")
var test = flag.String("test", " ", "测试")

func main() {
    flag.Parse()
    fmt.Println(strings.Join(flag.Args(), *sep))
    if *n {
        fmt.Println(*test)
    }
}
🎜Die Werte und Adressen von x und y sind nicht betroffen. Nachdem die Zeiger j und k ausgetauscht wurden, werden die Werte von j und k ausgetauscht. 🎜🎜🎜0x03 Lokale Variablen in der Funktion zurückgeben 🎜🎜🎜🎜In der Go-Sprache ist es auch sicher, die Adresse lokaler Variablen in der Funktion zurückzugeben. Der folgende Code erstellt beispielsweise eine lokale Variable v, wenn die f-Funktion aufgerufen wird. Nachdem die lokale Variablenadresse zurückgegeben wurde, ist sie immer noch gültig, da der Zeiger p immer noch auf diese Variable verweist. 🎜🎜
$ go run main.go --help
Usage of /var/exe/main:
  -n	print test
  -s string
    	separator (default " ")
  -test string
    	测试 (default " ")
exit status 2
$ go run main.go -s "+"  --test 测试文本 a bc def 123
a+bc+def+123
$ go run main.go -s "+" -n --test 测试文本 a bc def 123
a+bc+def+123
测试文本
🎜🎜0x04 Verwenden Sie new(), um den Zeiger zu erstellen Die Schlüsseltechnologie zum Implementieren des Flag-Pakets in der Standardbibliothek. Es wird verwendet, um das Parsen von Befehlszeilen-Flags zu implementieren. 🎜Beispiel: 🎜rrreee🎜Run🎜rrreee

Das obige ist der detaillierte Inhalt vonInformationen zum Verständnis des Golang-Zeigers. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen