golang の可変個引数パラメーターはインターフェイス型に使用できますか?
Go 言語では、変数パラメーターをインターフェイスの型に直接適用することはできません。解決策は、型アサーションを使用し、インターフェイス型を特定のインターフェイス型にアサートしてから、可変個引数構文を使用することです。たとえば、Printer インターフェイスを定義し、ConsolePrinter と FilePrinter の 2 つの構造体を実装し、MyFunction 関数で型アサーションを使用して、Printer インターフェイス型の可変数のパラメーターを Printer インターフェイスとしてアサートし、Print メソッドを呼び出します。
#Go 言語の変数パラメーターはインターフェイス型に適用できますか?
Go 言語では、変数パラメーター (...T
構文) は、同じ型の任意の数のパラメーターを受け入れる関数またはメソッドを表すために使用される糖鎖構文の一種です。ただし、インターフェイスの種類に直接適用することはできません。
インターフェイス タイプと変数パラメーター
インターフェイス タイプはメソッドのセットを定義しますが、実装自体は含まれません。したがって、インターフェイス型をインスタンス化することも、可変個引数構文を直接使用することもできません。
// 定义一个接口类型 type MyInterface interface { Method(arg string) } // 以下代码无效,因为接口类型不能作为可变参数 func MyFunction(args ...MyInterface) {}
解決策: 型アサーションを使用する
インターフェイス型を可変引数パラメーターとして使用するには、型アサーションを使用する必要があります。型アサーションを使用すると、変数の型を動的にチェックし、実行時に特定のインターフェイス型に変換できます。
次は、型アサーションを使用して変数パラメーター インターフェイス型を正しく実装する方法です。
func MyFunction(args ...interface{}) { for _, arg := range args { // 类型断言为 MyInterface 类型 if iface, ok := arg.(MyInterface); ok { iface.Method("some string") } else { // 处理非 MyInterface 类型的参数 } } }
実践的なケース
次は、変数パラメーター インターフェイス型を使用する実際的なケースです。 :
type Printer interface { Print(msg string) } type ConsolePrinter struct{} func (p *ConsolePrinter) Print(msg string) { fmt.Println(msg) } type FilePrinter struct { fileName string } func (p *FilePrinter) Print(msg string) { f, err := os.OpenFile(p.fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { panic(err) } defer f.Close() f.WriteString(msg + "\n") } func main() { printers := []Printer{ &ConsolePrinter{}, &FilePrinter{fileName: "output.txt"}, } MyFunction(printers...) }
このコードは、Printer
インターフェイスを実装する 2 つの構造体、ConsolePrinter
と FilePrinter
を定義します。 MyFunction
可変数の Printer
インターフェイス型を受け取り、型アサーションを使用して各パラメーターを Printer
インターフェイスとしてアサートし、Print
メソッドを呼び出します。 。
以上がgolang の可変個引数パラメーターはインターフェイス型に使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

マルチプロセスのログライティングの並行性セキュリティの問題を効率的に処理します。複数のプロセスが同じログファイルを同時に書き込みます。並行性が安全で効率的であることを確認する方法は?これは...
