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

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

王林
リリース: 2024-02-09 17:45:08
転載
818 人が閲覧しました

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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート