インターフェースアプリケーションのシナリオ
初心者にとって、インターフェイスの概念を理解することはそれほど難しくありません。難しいのは、インターフェイスをいつ使用するかがわからないことです。次に、いくつかのアプリケーション シナリオを示します。
1. 現在、米国が爆撃機や武装ヘリコプターを製造したい場合、専門家は航空機に必要な機能/仕様を決定し、それを他の人に実装させるだけで済みます。
構造体を記述したい場合、その構造体にはいくつかのメソッドがあります。プログラマがこれらのメソッドを記述するのは明らかに良いことではありません。全員を参加させたい場合は、プロジェクト マネージャに依頼できます。プロジェクト マネージャは、インターフェース: 誰でもこのインターフェースを実装するだけで完了です。このようにして、管理プロジェクトの進捗を適切に管理できます。
実際には、定義仕様を取得して、他の人にその仕様を実装させるだけです。
並べ替える場合は、このデータ インターフェイスを実装するだけで済みます。
実際、インターフェイス インターフェイスを実装するすべてのメソッドが渡されます。その後、パッケージ内のsortメソッドを呼び出して、この型を渡すことができます。
sort パッケージには Sort 関数があります。Sort はデータを受け入れます。これはインターフェイスです。したがって、渡された変数がインターフェイス内のすべてのメソッドを実装して渡されている限り、自然に並べ替えてくれます。インターフェイスを実装すると、Sort 関数が自動的に並べ替えの実装に役立ちます。
以下に示すように、以前は電子メールを使用してアラーム情報を送信していた場合、後でアラームの送信を ding に変更する場合は、コードを変更する必要があります。
//如果产生了一个告警,将告警发送给相关的人
//email sms weixin
type EmailSender struct {
}
type DingDingSender struct {
}
func (e *EmailSender) Send(msg string) error {
fmt.Println(msg)
return nil
}
func (d *DingDingSender) Send(msg string) error{
fmt.Println(msg)
return nil
}
func test(e *EmailSender,msg string) {
e.Send(msg)
}
func main() {
sender := new(EmailSender)
sender.Send("email send")
}
修正が必要な場合は、メール関連のコードをすべて修正する必要があります。修正しないとコンパイルが失敗します。
この問題を解決するために、インターフェイスを定義できます。これらの構造体の特徴の 1 つは、すべての構造体に Send メソッドがあることです。このようにして、Send メソッドのみを含むインターフェイスを定義すると、パラメーターの型でそのインターフェイス型を使用できるようになります。
インターフェイスが定義されていれば、構造体をインスタンス化する場所を 1 か所変更するだけで済むので、さらに便利です。
type Sender interface {
Send(string) error
}
sender := new(DingDingSender)
test(sender,"dingding send")
sender1 := new(EmailSender)
test(sender1,"email send")
2. 3 人のプログラマーを管理し、ソフトウェア機能を開発するプロジェクト マネージャーがいるとします。ソフトウェアを制御および管理するために、プロジェクト マネージャーはいくつかのインターフェイスを定義し、プログラマーによって実装されます。
プロジェクト マネージャーはインターフェイスを定義するだけで済み、残りはプログラマー abc に完了させます。このようにして、ソフトウェア開発の進捗を管理することができます。
注意事項と詳細
1)インターフェイス自体はインスタンスを作成できませんが、インターフェイスを実装するカスタム タイプの変数 (インスタンス) を指すことはできます。
type interfaceA interface {
Say()
}
type Student struct {
}
func (*Student) Say() {
fmt.Println("I am a student")
}
func main() {
var i interfaceA
student := new(Student)
i = student //结构体变量实现了接口的方法
i.Say()
}
2) インターフェース内のすべてのメソッドにはメソッド本体がありません。つまり、それらはすべて実装のないメソッドです。
3) Golang では、カスタム タイプはインターフェイスのすべてのメソッドを実装する必要があり、このカスタム タイプがインターフェイスを実装すると言います。
4) カスタム タイプがインターフェイスを実装する場合にのみ、カスタム タイプのインスタンス (変数) をインターフェイス タイプに割り当てることができます。
5)カスタム データ型である限り、構造型だけでなくインターフェイスも実装できます。
type interfaceA interface {
Say()
}
type integer int
func (i *integer) Say() {
fmt.Println("i地址为:", &i, "i的值为:", *i)
}
func main() {
var i interfaceA
var a integer = 5
a.Say()
}
6)カスタムタイプは複数のインターフェースを実装できます
7) Golang インターフェースには変数を含めることはできません
上でわかるように、従来の oop とは異なり、メソッドに基づいてこのインターフェイスを実装します。Java では、これらは明示的に実装されるため、実装するインターフェイスを明示的に指定する必要があります。Golang はどのインターフェースが実装されるかを気にせず、どのメソッドが実装されるかのみを考慮します。
8) インターフェイス (A インターフェイスなど) は、他の複数のインターフェイス (B インターフェイスや C インターフェイスなど) を継承できますが、この場合、A インターフェイスを実装する場合は、B インターフェイスと C インターフェイスのすべてのメソッドも実装する必要があります。
A インターフェイスには 2 つのメソッドがあることがわかります。これは、これら 2 つのインターフェイスを継承するのと同じです。次に、継承されたインターフェイスのメソッドと独自のメソッドの両方を実装する必要があります。
9) インターフェースの型はデフォルトでポインタ(参照型)となっており、初期化せずに使用した場合はnilが出力されます(構造体などのパラメータを渡す場合、渡されるのは値型ではなく参照になります) type. 、つまり &struct{} )
10)空のインターフェイスインターフェイスにはメソッドがないため、すべての型が空のインターフェイスを実装します (空のインターフェイスは実際にはデータ型です。空のインターフェイスには任意のデータ型の変数を割り当てることができます。パラメーターが仮パラメーターの場合)空のインターフェースは、任意のデータ型を受け入れることができることを意味します)
以下に示すように、この構造体はデフォルトで空のインターフェイスを実装していますが、文字列整数などの他の型も使用できます。
type T interface {
}
type student struct {
age int
name string
}
func main() {
s := &student{
age: 10,
name: "lucas",
}
var t T = s
fmt.Println(reflect.TypeOf(t))
fmt.Println(t)
var t3 interface{} = s
fmt.Println(t3)
}
*main.student
&{10 lucas}
&{10 lucas}
空のインターフェイスには任意の変数を割り当てることができます