4

Go 言語には、C スタイルのインターフェースに類似した機能としてインターフェース型があります。ただし、Go のインターフェース型は強制されていないようです。実際に型に適用されることなく、単にプロトコルを定義するだけです。それらは強制されていないため、インターフェースを使用することはまだ良い考えですか?

4

3 に答える 3

10

はい。Go では型階層の構築が許可されていないため、インターフェイスはポリモーフィズムを可能にするために非常に重要です。sort.Interfaceパッケージで定義されているものを検討してくださいsort:

type Interface interface {
    // Len is the number of elements in the collection.
    Len() int
    // Less returns whether the element with index i should sort
    // before the element with index j.
    Less(i, j int) bool
    // Swap swaps the elements with indexes i and j.
    Swap(i, j int)
}

sortパッケージには、このインターフェイスを実装するオブジェクトを期待する関数が含まれていますsort(data Interface)。インターフェイスがなければ、そのような形式のポリモーフィズムは go では不可能です。型がこのインターフェイスを実装することを明示的に注釈する必要がないという事実は関係ありません。

go の優れた点は、型が同じパッケージで定義されている限り、このインターフェイスをプリミティブ型に実装できることです。したがって、次のコードは、ソート可能な整数の配列を定義します。

type Sequence []int

// Methods required by sort.Interface.
func (s Sequence) Len() int {
    return len(s)
}
func (s Sequence) Less(i, j int) bool {
    return s[i] < s[j]
}
func (s Sequence) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
于 2012-06-15T16:50:30.067 に答える
3

はい、インターフェイスを使用することは依然として優れたアイデアです。Go はインターフェイスを強調します。https://talks.golang.org/2014/go4gophers.slide#5を参照してください。@ElianEbbing の優れた回答を拡張すると、任意の型およびアドホック インターフェイスのメソッドにより、軽量の OO プログラミング スタイルが実現します。https://talks.golang.org/2012/goforc.slide#48を参照してください。

例はこれを説明するかもしれません。

package main

import . "fmt"

func main() {
    c.Cry()      // Meow
    Cryer.Eat(c) // Fish
}

var c = cat{"Fish"}
type cat struct{ s string }
type Eater interface{ Eat() }
type Cryer interface {
    Cry()
    Eater
}
func (c cat) Eat() { Println(c.s) }
func (cat) Cry()   { Println("Meow") }

Cryerインターフェイスを使用すると、Cry()Eat()メソッドの両方にアクセスできます。https://talks.golang.org/2012/zen.slide#16を参照してください。Cryer基になるコードを変更せずに追加できます。https://stackoverflow.com/a/11753508/12817546を参照してください。コードを削除すると、コードは正常に機能します。に示すように、引き続きメソッドに直接アクセスできますc.Cry()。これは、Go では 2 つのことができるためです。

まず、インターフェイスを暗黙的に実装できます。インターフェイスは、単なるメソッドのセットです。https://talks.golang.org/2013/go4python.slide#33​​ を参照してください。インターフェイス変数は、インターフェイスのメソッドを実装している限り、インターフェイス以外の値を格納できます。https://blog.golang.org/laws-of-reflectionを参照してください。インターフェイスのすべてのメソッドを実装する任意の型の値を、そのインターフェイスの変数に割り当てることができます。https://talks.golang.org/2014/taste.slide#20を参照してください。

cの変数ですcat。およびメソッドをcat実装します。を明示的に実装します。と を明示的に実装します。したがって、 andインターフェースを暗黙的に実装します。https://talks.golang.org/2012/goforc.slide#40を参照してください。したがって、の変数はおよびの変数になることができます。https://golang.org/doc/effective_go.html#blank_implementsを参照してください。Eat()Cry()EaterEat()CryerCry()Eat()catEaterCryerccatEaterCryer

第 2 に、構造体とインターフェイスの型は、他の構造体とインターフェイスの型に埋め込むことができます。https://golang.org/doc/effective_go.html#embeddingを参照してください。を埋め込むのでCryer.Eat(c)呼び出します。したがって、Go のインターフェイスは、プログラムのコンポーネントを分離するための主要な手段です。https://www.reddit.com/r/golang/comments/6rwq2gを参照してください。また、インターフェイスがパッケージ、クライアント、またはサーバー間で優れた API を提供できる理由。https://stackoverflow.com/a/39100038/12817546を参照してください。Eat()Eater

利点が見られない場合は、インターフェイスを追加しないでください。https://stackoverflow.com/a/39100038/12817546のコメントを参照してください。明示的な階層は存在しないため、階層を設計する必要はありません! https://talks.golang.org/2012/goforc.slide#46を参照してください。必要なときにインターフェイスを追加します。最初にデータ型を定義し、それに沿って 1 ~ 3 個のメソッドを構築しますinterfacehttps://stackoverflow.com/a/11753508/12817546を参照してください。例に一致するように編集された引用。

于 2020-06-10T07:12:58.617 に答える
0

静的および実行時の型チェックとは何かを知りたいのですが、「インターフェイスを強制する」とはどういうことかわかりません。

于 2012-06-15T16:53:38.097 に答える