2016-09-15 7 views
1

値の型と参照の型の間のインターフェイスの充足可能性がわかりにくいです。私はまだそれがゴランでどのように機能するか把握できません。リファレンスタイプを満足しないインターフェイスに割り当てることができる理由[golang]

type Counter1 int 
type Counter2 int 

func (c Counter1) String() string { 

} 

func (c *Counter2) String() string { 

} 

func main() { 
    var c1 Counter1 
    var c2 Counter2 
    var i1 fmt.Stringer = &c1 // assignment 1 
    var i2 fmt.Stringer = c2 // assignment 2 
} 

ただし、割り当て1は機能しますが割り当て2は機能しません。私はそれらのどれも動作しないことを期待していました。タイプCounter1はfmt.Stringerを満たしますが、タイプ* Counter1は満たされません。したがって、& c1はi1に割り当てることはできません。タイプCounter2はfmt.Stringerを満たしませんが、タイプ* Counter2があります。したがって、c2はi2に代入することはできません。このテストプログラムの結果は私には意味がありません。私はコンパイラが参照型と値型の間で自動的に変換する、ある種の構文砂糖かもしれないと思った。しかし、次のテストコードは、私をもっと混乱させてしまいます。* Counter1型もCounter1型もinterface Testを満たしていません。しかし、最初と2番目の割り当てはまだ動作します。それは私には意味がありません。囲碁、セレクタ式(x.f)において

答えて

3

x(又は時には*x)のフィールドまたはメソッドfを意味します。

あなたは法上のポインタの受信機を持っている場合、基本的には、移動中に、あなたは&object.method()を記述する必要はありませんが、あなたはちょうどのでobject.method()

https://play.golang.org/p/nh8X-vwdfr

https://play.golang.org/p/1uKwZw6E-J

を書くことができますインタフェースは、オブジェクト自体がポインタでない限り、Goに暗黙的に含まれています。インタフェースを満たすメソッドがポインタ受信者を持つかどうかは関係ありませんが、それを満たすために使用されます。

だから、あなたの例では、Counter1構造体は、それに呼びかけ両方f()g()メソッドを持つことができますが、*Counter1はそれだけで呼び出さg()メソッドを持つことができます。

関連する問題