ホームページ  >  記事  >  バックエンド開発  >  Go インターフェースの使い方の紹介

Go インターフェースの使い方の紹介

尚
転載
2020-02-17 17:17:552766ブラウズ

go のインターフェースは、go プログラミングで非常に頻繁に使用され、特に空のインターフェースの使用により、Go 言語は非常に強力になります。 go 言語チュートリアル コラムでは、Go インターフェースの使い方を紹介します。

Go インターフェースの使い方の紹介

インターフェイスの概念について:

1. インターフェイスは 1 つ以上のメソッド シグネチャのコレクションです

2. 限りインターフェイスのすべてのメソッド シグネチャを使用すると、インターフェイスが実装されている場合でも、宣言がどのインターフェイスを実装するかを示す必要はありません。これは構造型付けと呼ばれます

3。インターフェイスにはメソッドのみがあります。宣言、実装なし、データ構造フィールドなし

4. インターフェイスは他のインターフェイスまたはインターフェイスに匿名で埋め込むことができます

#5. オブジェクトがインターフェイスにコピーされると、コピーはインターフェイス内に保存されているのはコピーへのポインタです。つまり、レプリカのステータスは変更できず、ポインタも取得できません。

6. インターフェイス呼び出しは自動的に受信者を変換しません

7. インターフェイスは、OOP と同様のポリモーフィズムを実装することもできます

8. 空のインターフェイスは、あらゆる種類のデータのコンテナとして使用できます

次に、最も基本的なインターフェイスを紹介しましょう。コンセプトの紹介 2

package 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.PhoneConnect

Disconnected from: IPhone

a はインスタンス化された PhoneConnect 型構造体です、ただし、切断機能では USB タイプのデータを受信する必要があります。a を渡すことができます。 ! !

コンセプト 7 を見てみましょう:

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)
}

印刷結果を見てください:

切断: IPhone

不明なデバイス:

b は 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 から切断されました

TV デバイス : ChuangWei から切断されました

詳細go 言語の知識については、PHP 中国語 Web サイトの

go 言語チュートリアル 列に注目してください。

以上がGo インターフェースの使い方の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。