2016-12-26 16 views
0

Goでは、インターフェースを実装する必要があると述べていません(動的言語の 'duck typing'に似た '構造タイピング'と呼ばれています)。 タイプを強制的にインターフェイスを実装する場合(たとえば、C#またはJavaでインターフェイスを継承するときなど)言い換えれば、インタフェースを実装することを忘れる(または署名を間違える)ことが間違いであり、その間違いを早期にキャッチしたい場合はどうでしょうか。それを行う最善の方法は何ですか?あなたが行うことGoタイプに強制的にインターフェースを実装する

+1

タイプを必須のインターフェイスとして使用するテストを作成します。タイプが前記インタフェースを実装しない限り、テストは合格しない。 – ain

答えて

2

最善のことは、あなたがタイプAStringerインタフェースを実装して確認する例えば

変数インターフェースにタイプのインスタンスを割り当てようとしています。

あなたはここでは、この

var _ Stringer = new(A) //or 
var _ Stringer = A{} 

のように行うことができますが、例Aでは、サンプルプログラムでは、インターフェイスを実装し、Bはここ

package main 

import (
    "fmt" 
) 

type Stringer interface { 
    String() string 
} 

type A struct { 
} 

func (a A) String() string { 
    return "A" 
} 

type B struct {} 


var _ Stringer = new(A) 
var _ Stringer = new(B) 

func main() { 

    fmt.Println("Hello, playground") 
} 

プレイリンクしません:play.golang

+1

その優雅な解決策のために@Sarathspに感謝します。私はそれが時々カナリー試験と呼ばれることを学んだ。(鉱山の貧しいカナリアから、鉱山に警告するのに十分な速さでガス中毒によって死ぬだろう)。 –

+0

私は、ダミー変数が単にコンパイラによって破棄され、スペースもCPU時間も消費しないと仮定します。疑わしい場合は、常に_test.goファイルに移動することができます。 –

+0

これはコンパイラによって破棄されます。そのファイルをテストファイルに移動するのはあなたの呼び出しですが、実装要件が明示的になるので、そこに置くことをお勧めします:D、 私は 'var _ St​​ringer =(* A)(nil)'と答えます。懸念事項:D –

0

への@Sarathspが言ったことを完了してください: 基本的に、ダミー変数を宣言することによって(アンダースコアは、あなたのタイプのインスタンスを割り当てている間、コンパイル時に非常に明白なエラーが発生します。

type MyType struct { 
    } 

    func (*MyType) Read() { 

    } 

    var _ io.Reader = &MyType{} 


cannot use MyType literal (type *MyType) as type io.Reader in assignment: 
     *MyType does not implement io.Reader (missing Read method) 

Or 

cannot use MyType literal (type *MyType) as type io.Reader in assignment: 
     *MyType does not implement io.Reader (wrong type for Read method) 
       have Read() 
       want Read([]byte) (int, error) 
関連する問題