次のコラム golang チュートリアル では、Golang ポインタの理解について紹介します。困っている友人の役に立てば幸いです。
#0x00 ポインタ アドレスとポインタ タイプ
変数は、対応するタイプの値を格納するメモリ空間に対応します。変数 ポインタ 値は別の変数のアドレスであり、ポインタ変数は任意の値のメモリ アドレスを指すことができます。 アドレス記号の取得&ポインタの型の前に
# を追加して、ポインタが指す内容を取得します。これは型チェンジャです。ポインタを使用します。値を参照することを間接参照と呼びます。
prt := &v // v 的类型为T
v フェッチしたアドレスの変数を表します。
prt は、
v のアドレス、
prt## の型を受け取ります。 # は *T
、T
というポインタ型です。
&
を使用して変数のアドレスを取得し、変数のポインタを取得します。ポインタを変更することができます このポインタが指す値を # 数値を使って取得することをポインタ値の取得といいます。
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">temp := "test content"
prt := &temp
fmt.Println(*prt) // 打印 test content</pre><div class="contentsignin">ログイン後にコピー</div></div>
変数、ポインタアドレス、ポインタ変数、アドレス、および値の関係と特性は次のとおりです。
ポインタ変数の値はポインタアドレスです。0x02 ポインタを使用して値を変更します。ポインタ変数に対して値 (*) 演算を実行して、ポインタ変数が指す元の変数の値を取得します。
# を使用して、ポインタが指す値を変更および操作します<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">x, y := 1, 2
fmt.Println(x, y) // 1 2
j, k := &x, &y
*j, *k = *k, *j
fmt.Println(x, y) // 2 1</pre><div class="contentsignin">ログイン後にコピー</div></div>
演算子の基本的な意味は、ポインタが指す変数を操作することです。演算が右辺値に対して行われる場合、演算は指される変数の値を取得し、演算が左辺値に対して行われる場合には、その値が指される変数に設定されます。x と y の値とアドレスは影響を受けません。ポインタ j と k が交換された後、j と k の値が交換されます。
参照されるポインタのみが交換される場合、参照される変数、値、およびアドレスは影響を受けず、アプリケーション ポインタのみが影響を受けます。
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ログイン後にコピー
0x03 関数でローカル変数を返す
Go 言語では、関数でローカル変数のアドレスを返すことも安全です。たとえば、次のようになります。次のコードは f を呼び出します。ローカル変数 v は関数中に作成され、ポインタ p がまだこの変数を参照しているため、ローカル変数アドレスが返された後も有効です。
0x04 new() でポインタを作成します。var p = f() func f() *int { v := 1 return &v }ログイン後にコピー
temp := new(int) *temp = 123 fmt.Println(*temp) // 123 fmt.Println(temp) // 0xaabb
ポインタは、標準ライブラリにフラグパッケージを実装するための重要な技術です。これは、コマンド ライン フラグ解析を実装するために使用されます。 例:
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 サイトの他の関連記事を参照してください。