2017-12-15 14 views
0

以下のコードを参照してください。私は、非ポインタ受信機がポインタ値と非ポインタ値を受け入れることができるが、ポインタ受信機はポインタ値だけを受け入れることができるということを知っている。それは言われている、私は最後の呼び出しがどのように動作し、2番目の最後の呼び出しが理解していない。 (Run Here非ポインタ値の呼び出しポインタ受信メソッド

問題点は、非ポインタメソッドからPointer Receiverメソッドを呼び出すことができることです。それはother similar questionで説明されていません。その答えはポインタ呼び出しポインタ受信メソッドについてのみ説明します。

package main 

import (
    "fmt" 
) 

type person struct { 
    name string 
} 

type human interface { 
    speak() string 
} 

func (p *person) speak() string { 
    return "Speak() called by " + p.name 
} 

func saySomething(h human) { 
    fmt.Println("area", h.speak()) 
} 

func main() { 
    p := person{"harsh"} 
    //works 
    saySomething(&p) 

    //doesn't work 
    //saySomething(p) 

    //works 
    p.speak() 
} 
+1

[Golangメソッドとポインタ受信機]の可能な複製(https://stackoverflow.com/questions/33936081/golang-method-with-pointer-receiver) – Marc

+0

https:// blog .golang.org/reflection of laws – Kaedys

答えて

1

タイプpersonhumanインタフェースを実装していないため、2番目の呼び出しが動作しない(のみ*personはありません)。非ポインタ値でポインタ受信機でメソッドを呼び出すことを可能にする "マジック"とその逆は、それらの特定のケースにのみ適用されます。インタフェース変数またはフィールドに値を割り当てたり、インタフェースを必要とするパラメータとして渡したりする場合、値の型はインタフェースを実装する必要があります。

p.speak()を呼び出す場合、コンパイラはそれを自動的に(&p).speak()に変更します。ポインターではないレシーバーを持つメソッドを持ち、それをポインターで呼び出すと、同様の変換が他の方向にも起こります。