例 1: Golang の空のインターフェイス
Go ではインターフェースと呼ばれる空のインターフェースから始めます。{}あらゆる種類の値を格納できる型を示します。以下は、Go の空のインターフェイスのソース コードです。
パッケージ 主要輸入 「fmt」
タイプ マーク電卓 インターフェース {}
機能 主要 () {
だった mマーク電卓
fmt 。 プリントイン ( メートル )
}
ここでは、「MarksCalculator」インターフェイスが空であるため、指定されたメソッド シグネチャを持たないコードを提供します。その結果、何の機能も提供されません。次に、この空のインターフェイスの main() 関数があり、MarksCalculator 型の変数「m」が宣言されています。インターフェイスは空であるため、「m」は任意の型の任意の値を保持できます。この場合、「m」は初期化されていないため、その型の値はゼロ、つまりインターフェイスの場合は「nil」になります。 「fmt.Println」を使用して「m」を出力すると、コンソールに「nil」が出力されます。
取得される出力は、前のソース コードから予想されたように「nil」です。
例 2: インターフェースの Golang 実装
このセクションでは、Golang インターフェイスの実装を示します。 Go で実装するには、型はインターフェイス内の指定された各メソッドの実装を提供する必要があります。以下は、インターフェイス実装のソース コードです。
パッケージ 主要
輸入 (
「fmt」
)
タイプ 母音 インターフェース {
検索母音 () [] ルーン
}
タイプ MyStr 弦
機能 ( セントミスト ) 検索母音 () [] ルーン {
だった 母音 [] ルーン
ために _ 、 ルーン := 範囲 セント {
もしも ルーン == 「あ」 || ルーン == 「そうですよ」 || ルーン == '私' || ルーン == 「お」 || ルーン == 'の' {
母音 = 追加する ( 母音 、 ルーン )
}
}
戻る 母音
}
機能 主要 () {
新しい文字列 := MyStr ( 「GoLangインターフェース」 )
だった v1 母音
v1 = 新しい文字列
fmt 。 プリントフ ( 「母音は %c です」 、 v1 。 検索母音 ())
}
ここで、コードは、ルーン (int32 型) のスライスを返す単一メソッド SearchVowels() を指定する「Vowels」という名前のインターフェイスを定義します。インターフェイスを使用すると、このメソッド シグネチャを実装する任意の型をインターフェイス型の変数に割り当てることができます。次に、基になる型文字列のエイリアスである新しい 'MyStr' 型が宣言されます。これは、「MyStr」は string のすべてのメソッドを継承しますが、別個の型であることを意味します。
その後、「MyStr」タイプの SearchVowels() メソッドを実装します。このメソッドは、入力文字列を 1 文字ずつスキャンし、各文字が母音 (「a」、「e」、「i」、「o」、または「u」) であるかどうかを確認します。文字が母音の場合、その文字は母音スライスに追加されます。
main() 関数内で、「MyStr」タイプの「NewString」変数が「GoLang Interfaces」値を使用して作成されます。次に、「Vowels」型の「v1」変数を宣言します。 「MyStr」は「Vowels」インターフェースで定義されているSearchVowels()メソッドを実装しているため、「v1」に「NewString」を割り当てることができます。
出力には、指定した文字列内で見つかったすべての母音の配列が表示されます。
例 3: Golang Stringer インターフェイス
さらに、Golang には、「fmt」パッケージに事前定義された「Stringer」インターフェースがあります。これにより、「fmt」パッケージの印刷関数で「%v」動詞を使用してフォーマットされた場合に、カスタム型でその文字列表現を制御できるようになります。以下は、Go のストリンガー インターフェイスのコード例です。
パッケージ 主要輸入 (
「fmt」
)
タイプ 学生 構造体 {
名前 弦
程度 弦
}
機能 ( 学生 ) 弦 () 弦 {
戻る fmt 。 スプリントフ ( 「%s は (n) %s です」 、 s 。 名前 、 s 。 程度 )
}
機能 主要 () {
s1 := 学生 { 「エレナ・ギルバート」 、 'コンピュータサイエンス' }
s2 := 学生 { 「キャロライン・キャンディス」 、 「BBA」 }
fmt 。 プリントイン ( s1 )
fmt 。 プリントイン ( s2 )
}
ここで、コードは最初に、コンソールに出力するために必要なパッケージ「fmt」をインポートします。次に、「Name」と「Degree」の 2 つのフィールドを持つ構造体タイプ「Student」を定義します。この構造体は生徒の情報を表します。さらに、「Student」タイプの String() メソッドが作成されます。このメソッドには「Student」タイプのレシーバーがあり、文字列を返します。 「String()」メソッドは、オブジェクトを印刷するときにその文字列表現をカスタマイズするために使用される Go の特別なメソッドです。この場合、「String()」メソッドは、学生の名前と学位を含む文字列をフォーマットして返します。
次に、main() 関数では、「Student」タイプの 2 つの変数 s1 と s2 が宣言され、学生情報で初期化されます。最後に、コードは fmt.Println() 関数を使用して s1 と s2 の値を出力します。 String() メソッドは「Student」型に対して定義されているため、Go は「Student」オブジェクトを出力するときにこのメソッドを自動的に呼び出します。 String() メソッドは、「fmt.Sprintf()」関数を使用して生徒の情報をフォーマットし、フォーマットされた文字列を返します。
次の出力は、ストリンガー インターフェイスの「Student」タイプのオブジェクトを出力します。
例 4: Golang タイプのスイッチ インターフェイス
次に、Go のタイプ スイッチ インターフェイスが登場します。型スイッチは、インターフェイス値の動的な型を検査できるようにする制御構造です。タイプ スイッチ インターフェイスのソース コードに従います。
パッケージ 主要輸入 'fmt
func MyFunction(F1 インターフェース{}) {
スイッチ F1.(タイプ) {
ケース整数:
fmt.Println(' タイプ : 整数 、 価値 : '、F1.(あなた))
大文字と小文字の文字列:
fmt.Println(' \nタイプ : 弦 、 価値 : '、F1.(文字列))
float64の場合:
fmt.Println(' \nタイプ : float64 、 価値 : '、F1.(float64))
デフォルト:
fmt.Println(' \nタイプが無効です ')
}
}
関数 main() {
MyFunction(' Golang インターフェイスのチュートリアル ')
マイファンクション(89.7)
MyFunction(true)
}
ここで、提供されたコードは、「interface{}」タイプの「F1」パラメータを取る「MyFunction」関数を定義します。これは、「F1」が任意の型の値を受け入れることができることを示します。関数内では、switch ステートメントを「F1.(type)」とともに使用して、「MyFunction」に渡される値の型を確認します。 「.(type)」構文は、インターフェイス値の基礎となる動的型を取得するために型スイッチで使用されます。ここでのスイッチのケースは、「int」、「string」、および「float64」の 3 つの特定の型を処理することに注意してください。 「F1」タイプが次のいずれかのケースに一致する場合。型アサーション (F1.(int)、F1.(string)、F1.(float64)) を使用して、対応する型と値を出力します。 「F1」タイプが定義されたケースのいずれにも一致しない場合は、デフォルトのケースが実行され、「タイプが無効です」と表示されます。
その後、main() 関数内で、文字列、float64、およびブール値 (switch ステートメントでは処理されません) という異なる値で「MyFunction」が 3 回呼び出されます。
出力には、タイプ アサーションを使用したスイッチ インターフェイスのデモが表示されます。
例 5: Golang の複数のインターフェイス
さらに、Go は、コンテキストに応じて異なる動作セットを提供できる複数のインターフェイスを提供します。この機能は「マルチインターフェイス」または「インターフェイス構成」と呼ばれます。次のコードは、複数のインターフェイスの実装を示しています。
パッケージ 主要輸入 「fmt」
タイプ 鳥 インターフェース {
息 ()
飛ぶ ()
}
タイプ 鳥類 インターフェース {
餌 ()
}
タイプ どこ 構造体 {
年 整数
}
機能 ( どこで ) 息 () {
fmt 。 プリントイン ( 「鳩は息をする」 )
}
機能 ( どこで ) 飛ぶ () {
fmt 。 プリントイン ( 「鳩が飛ぶ」 )
}
機能 ( どこで ) 餌 () {
fmt 。 プリントイン ( 「鳩は赤ちゃんを育てる」 )
}
機能 主要 () {
だった b 鳥
d := どこ {}
b = d
b 。 息 ()
b 。 飛ぶ ()
だった 鳥類
ある = d
ある 。 餌 ()
}
ここでは、「birds」と「avians」という 2 つのインターフェースを定義します。 「birds」インターフェースは、breath() と fly() という 2 つのメソッドを宣言します。一方、「avians」インターフェースは feed() メソッドを宣言します。次に、「dove」構造体は、「birds」インターフェースと「avians」インターフェースの両方のメソッドをすべて実装します。これは、breath()、fly()、および feed() の実装を提供します。
次に、main()関数内で「birds」型の変数「b」を宣言します。 「鳩」のインスタンスが作成され、b = d 割り当てを使用して「b」に割り当てられます。 「dove」は「birds」インターフェースのすべてのメソッドを実装しているため、この割り当ては有効です。
次に、「birds」タイプの「b」に対してbreath()メソッドとfly()メソッドが呼び出されます。同様に、「avians」タイプの変数「a」が宣言され、「d」の「dove」インスタンスが割り当てられます。 「dove」は「avians」インターフェースで定義されている feed() メソッドを実装しているため、この割り当ても有効です。 feed() メソッドは、「avians」タイプの「a」に対して呼び出されます。 「a」は「dove」インスタンスを保持しているため、「dove」が実装する feed() メソッドが実行されます。
出力は、インターフェイスのメソッドが正しく実行されたことを示しています。
結論
Go インターフェイスの基本を学び、その使用法を示す実践的な例を提供しました。インターフェイスを定義し、さまざまなタイプで実装することで、柔軟で拡張可能なプログラムを作成できます。