Go 言語では、変数パラメーターをインターフェイスの型に直接適用することはできません。解決策は、型アサーションを使用し、インターフェイス型を特定のインターフェイス型にアサートしてから、可変個引数構文を使用することです。たとえば、Printer インターフェイスを定義し、ConsolePrinter と FilePrinter の 2 つの構造体を実装し、MyFunction 関数で型アサーションを使用して、Printer インターフェイス型の可変数のパラメーターを Printer インターフェイスとしてアサートし、Print メソッドを呼び出します。
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 サイトの他の関連記事を参照してください。