2017-05-02 3 views
1

ここにGoプログラムがあります。ここで、pは構造体へのポインタである場合でもp.Field((* p).Field)が有効な構文であると定義していますか?

package main 

import (
    "fmt" 
) 

type Person struct { 
    Name string 
} 

func main() { 
    p := &Person{"Jack"} 

    // The following statement makes sense. We dereference the 
    // pointer to reach the Person object and then retrieve its Name 
    // field. 
    fmt.Println((*p).Name) 

    // But the following statement does not make sense. How does 
    // this code work by retrieving the Name field directly from the 
    // pointer without dereferencing it? 
    fmt.Println(p.Name) 
} 

ここに出力があります。

$ go run foo.go 
Jack 
Jack 

pはそれを逆参照することなく、その場Nameにアクセスするために合法であるか、タイプ*PersonPersonへすなわちポインタのでしょうか? (*p).Nameの代わりにp.Nameという構文を使用してGoチュートリアルをすべて表示しますが、正確にGo言語で正規表現としてp.Personが定義されていますか?

答えて

3

Spec: Selectors:

以下の規則は、セレクタに適用される:

[...] xの種類は、指定ポインタ型であり、(*x).fは、有効なセレクタフィールドを表す式(しかしでない場合方法)、x.fは、(*x).fの略語です。

言語仕様は、ポインター構文を使用して、場合によってはポインタを使用していないと感じさせるのに役立ちます。そのフィールドにアクセスするためのポインタを省略することもその1つです。また、アドレス可能であれば、非ポインタ値のポインタ受信者を持つメソッドを呼び出すこともできます。Calling a method with a pointer receiver by an object instead of a pointer to it?

また、配列ポインタをインデックス付けしてスライスすることもできます。 aが配列型へのポインタである場合:

  • a[x](*a)[x]
  • a[low : high]ための速記である(*a)[low : high]の省略形です。
関連する問題