2016-11-20 7 views
2

私はゴーランを学び始めました。structの&演算子がデジタルアドレスを返さないのはなぜですか?

&オペレータは、単純型と構造体の動作が異なることがわかりました。

  • 単純型の場合、&はアドレスを返します。

  • structの場合は、他のものを返します。

コード:

package main 

import "fmt" 

type person struct { 
    name string 
    age int 
} 

func main() { 
    s1 := "abc" 
    fmt.Println("s1 address =", &s1) 

    s2 := person{"Sam", 55} 
    fmt.Println("s2 address = ", &s2) 

} 

出力:

[ `hello` | done: 79.0079ms ] 
    s1 address = 0xc04203c1e0 
    s2 address = &{Sam 55} <======== What's this? And why not some address like above? 

繰り返しますが、このデザインはhave-toまたはhappen-toのですか?

答えて

10

ユニタリ演算子&は、組み込み型および構造体に対して同じ動作をします。varのメモリアドレスを取得するために使用されます。この場合、Goは常にfmt.Println()のパラメータが構造体または構造体へのポインタであり、その場合にはデバッグ目的で構造体の各フィールドを出力しようとしますが、Goが常にチェックするため、&{Sam 55}が表示されます。ifあなたはこのように、あなたは%pでfmt.Printf()を使用することができますポインタを見たい:

func main() { 
    s1 := "abc" 
    fmt.Println("s1 address =", &s1) 

    s2 := person{"Sam", 55} 

    fmt.Println("s2 as pointer =", &s2) 

    fmt.Printf("s2 address = %p value with fields %+v", &s2, s2) 
} 

ボーナス:あなたはフィールド名を印刷する%+vを使用して値ができ

https://play.golang.org/p/p7OVRu8YWB

+0

すなわちそれは、文字列へのポインタと構造体へのポインタに対して異なる動作をするfmt.Println()です。 – md2perpe

+0

つまり、fmt.PrintlnはString()メソッドを呼び出そうとし、各タイプはデフォルトの文字列表現を持ちます –

関連する問題