Golang では、匿名の構造体を作成し、インターフェース型を受け入れる関数に引数として渡すことができます。ただし、インターフェイスにメソッドが定義されていない場合、匿名構造体のフィールドに直接アクセスすることはできません。
次のコード例を考えてみましょう:
<code class="go">func NewJob(t string, name string, c func(), v interface{}) { // ... } func Custom(name string) interface{} { // ... } main() { gojob.NewJob("every 2 seconds", "pene", func() { t := gojob.Custom("pene") fmt.Println(t) // Prints "{1}" fmt.Println(t.Id) // Error: t.Id undefined (type interface {} is interface with no methods) }, struct { Id int }{ 1, }) }</code>
この例では、匿名の構造体を v 引数として NewJob に渡します。 Custom 関数は、「pene」という名前に関連付けられたカスタム値を取得し、インターフェースとして返します。
ゴルーチン内の匿名構造体の ID フィールドにアクセスしようとすると、エラー「」が発生します。 t.IDが未定義です」。これは、interface{} 型にはメソッドが定義されていないため、具体的な型のように扱うことができないためです。
匿名構造体のフィールドにアクセスするには、互換性のある型に型アサートする必要があります。 。この場合、v には int 型の Id フィールドを持つ匿名構造体が含まれていることがわかります。次の構文を使用してアサートを入力できます。
<code class="go">id := v.(struct{Id int}).Id</code>
これにより、interface{} 値 v が ID フィールドを持つ具体的な構造体に変換され、直接アクセスできるようになります。
Interface{} 値を型アサートすることで、匿名構造体のフィールドにアクセスし、必要に応じてそれらを使用できます。
以上がGolangでメソッドなしでインターフェイスとして渡された匿名構造体のフィールドにアクセスする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。