インターフェイスを使用してさまざまな構造体を正規化するにはどうすればよいですか?

swasheck:

私はGoを使用してさまざまなperfmon統計を収集し、それらをEAVモデルのようなものに正規化したいと思っていますが、これを達成する方法に頭を悩ませています。

これらの構造体の例を考えると:

type Win32_PerfFormattedData_Counters_ProcessorInformation struct {
    Name                    string
    C1TransitionsPersec     uint64
    C2TransitionsPersec     uint64
    C3TransitionsPersec     uint64
    PercentUserTime         uint64
    PercentInterruptTime    uint64
    PercentPrivilegedTime   uint64
    PercentC1Time           uint64
    PercentC2Time           uint64
    PercentC3Time           uint64
}
type Win32_PerfFormattedData_Tcpip_NetworkAdapter struct {
    Name                        string
    BytesSentPersec             uint64
    BytesReceivedPersec         uint64
    OffloadedConnections        uint64
    PacketsOutboundDiscarded    uint64
    PacketsOutboundErrors       uint64
    PacketsReceivedDiscarded    uint64
    PacketsReceivedErrors       uint64  
}

それらを次のように正規化したいと思います。

type Counter struct {
    counter_category        string
    counter_name            string
    counter_instance        string
    counter_value           uint64
}

使用reflectしてこれを思いつくことができました:

func pivot(cpu_info *[]Counter, cpu Win32_PerfFormattedData_Counters_ProcessorInformation, category string) {
    e := reflect.ValueOf(&cpu).Ellem()
    for i := 0; i < e.NumField(); i++ {
        f_name := e.Type().Field(i).Name
        f_value := e.Field(i).Interface()
        if f_name != "Name" {
            c := Counter {
                counter_category: category,
                counter_name: f_name,
                counter_instance: cpu.Name,
                counter_value: f_value.(uint64),
            }
            *cpu_info = append(*cpu_info,c)
        }
    }
}

ただし、私が収集しているカウンターカテゴリは17あり、これらの関数を17個記述するのが最善の方法であるとは思いません(ただし、それが正しく、修正できる場合を除きます)。

これまでにインターフェースを使用する関数を使用してきましたが、私が正しい道にいるかどうかはわかりません:

func pivot_counter(counter interface{}, counter_info *[]Counter) {
    var counter_category string
    switch t := counter.(type) {
    case []Win32_PerfFormattedData_Counters_ProcessorInformation:
        counter_category = "Processor"
        fmt.Printf("%T\r\n",t)
    case []Win32_PerfRawData_Tcpip_NetworkAdapter:
        counter_category = "Network Adapter"
        fmt.Printf("%T\r\n",t)
    default:
        counter_category = "Unknown"
        fmt.Printf("%T\r\n", t)
    }
}

しかし、ここで私が行き詰まっているのは、それらのケース内に「ピボット」ロジックの17の異なるブロックを持つ17の異なるケースステートメントを作成する必要がある場所にいるためです。私は何か間違ったことをしていることを知っています。私は基本的に、構造体/インターフェイスを受け入れ、型アサーションを介して型を決定し、そのオブジェクトを使用して構造体フィールドを反復して均一な形式にピボットアウトする関数を記述しようとしています。現在自分がいる場所からどこへ行くのですか?

火曜日:

インターフェイスを定義します。

type CounterMaker interface {
    MakeCounter() Counter
}

今、あなたが持っているタイプごとに、それがCounterMakerをサポートするようにしてください:

type Win32_PerfFormattedData_Counters_ProcessorInformation struct {
    ...
}

func (value Win32_PerfFormattedData_Counters_ProcessorInformation) MakeCounter() Counter {
    ... code to turn "value" into a counter ...
    return result
}

他のタイプについても繰り返します。

(上記のインターフェースは必ずしも正しいものではありません。状況に合ったものを選択してください。)

ここで、Counterインスタンスを必要とする関数がある場合は、それを呼び出す前に、またはその内部で作成できます。例えば:

func Increment(running *Counter, newstuff CounterMaker) {
    inc := CounterMaker.MakeCounter()
    // maybe double check that the running counter matches w/ "inc"
    running.counter_value += inc.counter_value
}

この例を使用して実行した場合(これも正しい方法ではない可能性がありWin32_PerfFormattedData_Counters_ProcessorInformationます)、2番目の引数として値を渡すことができます。これIncrementは、それがを実装するMakeCounterため、として修飾されるためCounterMakerです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Google Guiceを使用してさまざまなインターフェースをバインドするにはどうすればよいですか?

分類Dev

文字列を使用してさまざまなサイズの配列の構造体を設計するにはどうすればよいですか?

分類Dev

構造体が参照されている他の構造体の存続期間を超えないように、生のポインターを使用して構造体でPhantomDataを使用するにはどうすればよいですか?

分類Dev

その配列へのポインタを使用して、構造体の配列に含まれる構造体のフィールドにアクセスするにはどうすればよいですか?[C ++]

分類Dev

matchステートメントでインスタンス化された構造体値を使用するにはどうすればよいですか?

分類Dev

Golang:まだ初期化されていない構造体でポインターをどのように使用しますか

分類Dev

構造体のグローバル配列を宣言し、それをさまざまな関数で使用するにはどうすればよいですか?

分類Dev

さまざまなタイプの引数の1つの構造体にFn特性を実装するにはどうすればよいですか?

分類Dev

不明なインターフェイスで構造体の値を取得するにはどうすればよいですか{}

分類Dev

インターフェイス{}を特定の構造体として関数に渡すにはどうすればよいですか?

分類Dev

リフレクトを使用して、構造体フィールドのタイプがインターフェースかどうかを確認するにはどうすればよいですか?

分類Dev

goのタグではなく、構造体のタイプを使用して構造体を再整列するにはどうすればよいですか?

分類Dev

ポインタと配列を使用してネストされた構造体にアクセスするにはどうすればよいですか?

分類Dev

ライフタイムが異なる複数のstr変数を使用して構造体を構築するにはどうすればよいですか?

分類Dev

インターフェイススライスで構造体変数の値を設定するにはどうすればよいですか?

分類Dev

親子関係なしでサービスのさまざまなインスタンスを使用するにはどうすればよいですか?

分類Dev

マクロ内で型(ty)を使用して、Rustで構造体インスタンスを構築するにはどうすればよいですか?

分類Dev

Cのプロセス間でポインターを使用して構造体を共有するにはどうすればよいですか?

分類Dev

Golangで構造体データとインターフェースデータを比較するにはどうすればよいですか?

分類Dev

インスタンス化のために構造体のフィールドに制約を追加するにはどうすればよいですか?

分類Dev

1つのコンテナを使用してさまざまなタイプのデータを処理するにはどうすればよいですか?

分類Dev

「text」属性を使用してファイルを正規化した後、gitにマスターブランチをチェックアウトさせ、キャリッジリターンを削除するにはどうすればよいですか?

分類Dev

カスタマイズされたインデックスを使用して、同じPandasシリーズ列のさまざまな部分をさまざまな色でプロットするにはどうすればよいですか?

分類Dev

コンストラクターを提供せずに単純な構造体を作成して初期化するにはどうすればよいですか?

分類Dev

構造体の配列でintポインタメンバーを初期化して動的に割り当てるにはどうすればよいですか?

分類Dev

Cで構造体なしでネストされたダブルポインタを作成するにはどうすればよいですか?

分類Dev

リフレクトを使用して構造体のスライスのフィールドを変更するにはどうすればよいですか?

分類Dev

名前空間を使用するグローバル構造体を定義して、構造体を使用するファイルがこの名前空間を使用しないようにするにはどうすればよいですか?c ++

分類Dev

リフレクションを使用して構造体のスライスを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    Google Guiceを使用してさまざまなインターフェースをバインドするにはどうすればよいですか?

  2. 2

    文字列を使用してさまざまなサイズの配列の構造体を設計するにはどうすればよいですか?

  3. 3

    構造体が参照されている他の構造体の存続期間を超えないように、生のポインターを使用して構造体でPhantomDataを使用するにはどうすればよいですか?

  4. 4

    その配列へのポインタを使用して、構造体の配列に含まれる構造体のフィールドにアクセスするにはどうすればよいですか?[C ++]

  5. 5

    matchステートメントでインスタンス化された構造体値を使用するにはどうすればよいですか?

  6. 6

    Golang:まだ初期化されていない構造体でポインターをどのように使用しますか

  7. 7

    構造体のグローバル配列を宣言し、それをさまざまな関数で使用するにはどうすればよいですか?

  8. 8

    さまざまなタイプの引数の1つの構造体にFn特性を実装するにはどうすればよいですか?

  9. 9

    不明なインターフェイスで構造体の値を取得するにはどうすればよいですか{}

  10. 10

    インターフェイス{}を特定の構造体として関数に渡すにはどうすればよいですか?

  11. 11

    リフレクトを使用して、構造体フィールドのタイプがインターフェースかどうかを確認するにはどうすればよいですか?

  12. 12

    goのタグではなく、構造体のタイプを使用して構造体を再整列するにはどうすればよいですか?

  13. 13

    ポインタと配列を使用してネストされた構造体にアクセスするにはどうすればよいですか?

  14. 14

    ライフタイムが異なる複数のstr変数を使用して構造体を構築するにはどうすればよいですか?

  15. 15

    インターフェイススライスで構造体変数の値を設定するにはどうすればよいですか?

  16. 16

    親子関係なしでサービスのさまざまなインスタンスを使用するにはどうすればよいですか?

  17. 17

    マクロ内で型(ty)を使用して、Rustで構造体インスタンスを構築するにはどうすればよいですか?

  18. 18

    Cのプロセス間でポインターを使用して構造体を共有するにはどうすればよいですか?

  19. 19

    Golangで構造体データとインターフェースデータを比較するにはどうすればよいですか?

  20. 20

    インスタンス化のために構造体のフィールドに制約を追加するにはどうすればよいですか?

  21. 21

    1つのコンテナを使用してさまざまなタイプのデータを処理するにはどうすればよいですか?

  22. 22

    「text」属性を使用してファイルを正規化した後、gitにマスターブランチをチェックアウトさせ、キャリッジリターンを削除するにはどうすればよいですか?

  23. 23

    カスタマイズされたインデックスを使用して、同じPandasシリーズ列のさまざまな部分をさまざまな色でプロットするにはどうすればよいですか?

  24. 24

    コンストラクターを提供せずに単純な構造体を作成して初期化するにはどうすればよいですか?

  25. 25

    構造体の配列でintポインタメンバーを初期化して動的に割り当てるにはどうすればよいですか?

  26. 26

    Cで構造体なしでネストされたダブルポインタを作成するにはどうすればよいですか?

  27. 27

    リフレクトを使用して構造体のスライスのフィールドを変更するにはどうすればよいですか?

  28. 28

    名前空間を使用するグローバル構造体を定義して、構造体を使用するファイルがこの名前空間を使用しないようにするにはどうすればよいですか?c ++

  29. 29

    リフレクションを使用して構造体のスライスを作成するにはどうすればよいですか?

ホットタグ

アーカイブ