go のインターフェースは、go プログラミングで非常に頻繁に使用され、特に空のインターフェースの使用により、Go 言語は非常に強力になります。 go 言語チュートリアル コラムでは、Go インターフェースの使い方を紹介します。
インターフェイスの概念について:
1. インターフェイスは 1 つ以上のメソッド シグネチャのコレクションです
2. 限りインターフェイスのすべてのメソッド シグネチャを使用すると、インターフェイスが実装されている場合でも、宣言がどのインターフェイスを実装するかを示す必要はありません。これは構造型付けと呼ばれます
3。インターフェイスにはメソッドのみがあります。宣言、実装なし、データ構造フィールドなし
4. インターフェイスは他のインターフェイスまたはインターフェイスに匿名で埋め込むことができます
#5. オブジェクトがインターフェイスにコピーされると、コピーはインターフェイス内に保存されているのはコピーへのポインタです。つまり、レプリカのステータスは変更できず、ポインタも取得できません。6. インターフェイス呼び出しは自動的に受信者を変換しません7. インターフェイスは、OOP と同様のポリモーフィズムを実装することもできます8. 空のインターフェイスは、あらゆる種類のデータのコンテナとして使用できます次に、最も基本的なインターフェイスを紹介しましょう。コンセプトの紹介 2package main import ( "fmt" ) type USB interface { // 定义一个USB接口 ,该接口拥有PhoneConnect的所有方法签名, Name() string //即就实现了PhoneConnect的接口,无需在声明。这就是上面说的第2条 Connect() } type PhoneConnect struct { //定义的结构体 name string } func (pc PhoneConnect) Name() string{ //上面结构体的方法 return pc.name } func (pc PhoneConnect) Connect(){ fmt.Println("Connectd to: ",pc.name) } func main(){ var a USB //声明该接口 a = PhoneConnect{"IPhone"} //该接口已经支持PhoneConnect这个结构体了。初始化该结构体 a.Connect() //调用该结构体的Connect方法 }上記の例を理解したら、読み続けてください。 USB タイプのパラメータを受け取る別の関数を定義します。 a を渡します。実際、 a はすでにphoneConnect のすべてのメソッドを呼び出すことができます。そしてこの時、私は少し曖昧な発言をしました。
func Disconnect(usb USB){ fmt.Println("Discounnectd from:",usb.Name()) } func main(){ a := PhoneConnect{"IPhone"} //a是什么类型呢? fmt.Println("type:",reflect.TypeOf(a)) Disconnect(a) }実行結果を確認します:
type: main.PhoneConnecta はインスタンス化された PhoneConnect 型構造体です、ただし、切断機能では USB タイプのデータを受信する必要があります。a を渡すことができます。 ! ! コンセプト 7 を見てみましょう:Disconnected from: IPhone
type USB interface { // 定义一个USB接口 ,该接口拥有PhoneConnect的所有方法签名, Name() string // Connect //嵌入了一个Connect接口,效果和最开始演示的是一样的 } type Connect interface { Connect() }Name() メソッドと Connect() メソッドを満たす構造はすべて USB と見なされます。何か問題がありますか? DisConnect() 関数に渡した USB が携帯電話ではない場合はどうすればよいですか? ? OK パターンを使用するだけです。たとえば、TV 構造を追加すると、TV にも USB インターフェイスが追加されます。
type TVConnect struct { name string } func (tc TVConnect) Name() string{ return tc.name } func (tc TVConnect) Connect() { fmt.Println("Connect to: ",tc.name) } func Disconnect(usb USB){ if rs,ok := usb.(PhoneConnect);ok{ fmt.Println("Disconnect: ",rs.name) }else{ fmt.Println("Unknown device: ") } } func main(){ a := PhoneConnect{"IPhone"} b := TVConnect{"ChuangWei"} Disconnect(a) Disconnect(b) }印刷結果を見てください:
切断: IPhoneb は Skyworth の USB インターフェイスですTV ですが、b は TV なので切断機能では認識されません。 また進歩しました。 Disconnect 機能で受信データの構造を判断できるため、USB インターフェイスの種類を気にする必要がなくなりました。空のインターフェイスとして直接定義します。とにかく、関数内であなたがどのタイプであるかを判断しようとしています。不明なデバイス:
func Disconnect(usb interface{}){ //注意,这里是空接口 switch v:=usb.(type) { case PhoneConnect: fmt.Println(" Phone device Disconnected from",v.name) case TVConnect: fmt.Println("TV device Disconnected from",v.name) default: fmt.Println("Unknown device ...") } } func main(){ a := PhoneConnect{"IPhone"} b := TVConnect{"ChuangWei"} Disconnect(a) Disconnect(b) }印刷状況を確認してください:
電話デバイス : IPhone から切断されました詳細go 言語の知識については、PHP 中国語 Web サイトのTV デバイス : ChuangWei から切断されました
go 言語チュートリアル 列に注目してください。
以上がGo インターフェースの使い方の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。