ホームページ  >  記事  >  バックエンド開発  >  Goで親タイプオブジェクトのサブタイププロパティにアクセスするにはどうすればよいですか?

Goで親タイプオブジェクトのサブタイププロパティにアクセスするにはどうすればよいですか?

王林
王林転載
2024-02-09 17:45:08735ブラウズ

Goで親タイプオブジェクトのサブタイププロパティにアクセスするにはどうすればよいですか?

Go 言語では、親型オブジェクトのサブタイプ プロパティにアクセスする必要がある状況によく遭遇します。これは、構造を定義するときに入れ子構造を使用しているためである可能性があります。ただし、Go 言語には継承の概念がないため、親タイプのオブジェクトを通じてサブタイプのプロパティに直接アクセスすることはできません。では、この要件を Go で実装するにはどうすればよいでしょうか?以下に、よく使われるいくつかの方法を紹介します。

質問内容

ファイルストレージを作成しています。さまざまな種類のファイルを作成しようとしています。これをシミュレートするには、コードを使用します:

リーリー

次の出力が期待されています:

リーリー

しかし、Go コンパイラでは次のエラーが発生しました:

./main.go:38:44: v.Duration が未定義です (タイプ File にはフィールドまたはメソッド Duration がありません)

./main.go:40:39: v.Width が未定義です (File 型にはフィールドまたはメソッド width がありません)

./main.go:40:48: v.Height が未定義です (タイプ File にはフィールドまたはメソッド Height がありません)

エラーを修正するにはどうすればよいですか?

解決策

<code>package main

import (
    "fmt"
    "time"
)

type File interface{}

type Audio struct {
    File
    Duration time.Duration
}

type Image struct {
    File
    Width  uint
    Height uint
}

func main() {
    var files = map[string]File{
        "1": Audio{
            Duration: 14 * time.Second,
        },
        "2": Image{
            Height: 9989,
            Width:  1111,
        },
        "3": Image{
                        Width:  1234,
            Height: 5678,
        },
    }
    for k, v := range files {
        switch v.(type) {
        case Audio:
            fmt.Printf("%s: Audio %d seconds", k, v.Duration / time.Second)
        case Image:
            fmt.Printf("%s: Image %dx%d", k, v.Width, v.Height)
        }
    }
}
</code>

は、期待する型で新しい v を宣言します。

以上がGoで親タイプオブジェクトのサブタイププロパティにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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