ホームページ  >  記事  >  バックエンド開発  >  Golang ポインタの理解について

Golang ポインタの理解について

藏色散人
藏色散人転載
2020-11-05 15:36:242004ブラウズ

次のコラム golang チュートリアル では、Golang ポインタの理解について紹介します。困っている友人の役に立てば幸いです。

Golang ポインタの理解について

#0x00 ポインタ アドレスとポインタ タイプ

変数は、対応するタイプの値を格納するメモリ空間に対応します。変数 ポインタ 値は別の変数のアドレスであり、ポインタ変数は任意の値のメモリ アドレスを指すことができます。

アドレス記号の取得

&ポインタの型の前に
# を追加して、ポインタが指す内容を取得します。これは型チェンジャです。ポインタを使用します。値を参照することを間接参照と呼びます。

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

v フェッチしたアドレスの変数を表します。prt は、v のアドレス、prt## の型を受け取ります。 # は *TT というポインタ型です。

0x01 ポインタからポインタが指す値を取得します。

&

を使用して変数のアドレスを取得し、変数のポインタを取得します。ポインタを変更することができます このポインタが指す値を # 数値を使って取得することをポインタ値の取得といいます。 <pre class="brush:php;toolbar:false">temp := &quot;test content&quot; prt := &amp;temp fmt.Println(*prt)   // 打印 test content</pre>変数、ポインタアドレス、ポインタ変数、アドレス、および値の関係と特性は次のとおりです。

変数に対してアドレス (&) 演算を実行すると、次のようになります。この変数ポインタ変数を取得します。
ポインタ変数の値はポインタアドレスです。

ポインタ変数に対して値 (*) 演算を実行して、ポインタ変数が指す元の変数の値を取得します。

0x02 ポインタを使用して値を変更します。

# を使用して、ポインタが指す値を変更および操作します<pre class="brush:php;toolbar:false">x, y := 1, 2 fmt.Println(x, y)  // 1 2 j, k := &amp;x, &amp;y *j, *k = *k, *j fmt.Println(x, y)  // 2 1</pre>

#*
演算子の基本的な意味は、ポインタが指す変数を操作することです。演算が右辺値に対して行われる場合、演算は指される変数の値を取得し、演算が左辺値に対して行われる場合には、その値が指される変数に設定されます。

参照されるポインタのみが交換される場合、参照される変数、値、およびアドレスは影響を受けず、アプリケーション ポインタのみが影響を受けます。

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
x と y の値とアドレスは影響を受けません。ポインタ j と k が交換された後、j と k の値が交換されます。

0x03 関数でローカル変数を返す

Go 言語では、関数でローカル変数のアドレスを返すことも安全です。たとえば、次のようになります。次のコードは f を呼び出します。ローカル変数 v は関数中に作成され、ポインタ p がまだこの変数を参照しているため、ローカル変数アドレスが返された後も有効です。

var p = f()

func f() *int {
    v := 1
    return &v
}

0x04 new() でポインタを作成します。

	temp := new(int)
	*temp = 123
	fmt.Println(*temp)  // 123
	fmt.Println(temp)  //  0xaabb
0x05 フラグパッケージのポインタ技術

ポインタは、標準ライブラリにフラグパッケージを実装するための重要な技術です。これは、コマンド ライン フラグ解析を実装するために使用されます。 例:

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)
    }
}

実行

$ 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
测试文本

以上がGolang ポインタの理解についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。