「reflect」を使用して構造体の構造体内にインターフェース値を設定する方法

calvinchso

「reflect」パッケージを使用してインターフェース値を設定しようとして苦労しました。インターフェイス値は、実際には構造体の構造体の内部にあります。で私のコードを参照してください行く遊び場を

基本的に、内部initProcでは構造体のフィールドにdummyAFunc関数を割り当てたいDummyABox

package main 

import (
    "fmt"
    "reflect"
)

type Box struct {
    Name               string
    DummyA             interface{}
}

type SmartBox struct {
    Box
}

func dummyAFunc(i int) {
    fmt.Println("dummyAFunc() is here!")
}

func initProc(inout interface{}) {
    // Using "inout interface{}", I can take any struct that contains Box struct
    // And my goal is assign dummyAFunc to dummyA in Box struct

    iType:=reflect.TypeOf(inout)
    iValue:=reflect.ValueOf(inout)
    
    fmt.Println("Type & value:", iType.Elem(), iValue.Elem()) // Type & value: *main.SmartBox &{{ <nil>}}

    e := reflect.ValueOf(inout).Elem()
    
    fmt.Println("Can set?", e.CanSet()).      // true
    fmt.Println("NumField", e.NumField())     // panic: reflect: call of reflect.Value.NumField on ptr Value ?????
    fmt.Println("NumMethod", e.NumMethod())   // NumMethod = 0
        
}

func main() {
    smartbox := new (SmartBox)
    initProc(&smartbox)
}

私はGoを初めて使用し、反射の法則を読みましたが、それでも理解できません。助けてください。ありがとう!

colm.anseo

にを渡して**SmartBixinitProcます。したがって、reflectで一度逆参照Elem()すると、まだポインタ(*Smart boxが得られます

newすでにポインタを返しているので、次を使用してください。

smartbox := new (SmartBox)

// InitProc(smartbox) // **SmartBox
InitProc(smartbox) // *SmartBox

https://play.golang.org/p/j4q6aq6QL_4


編集

入力構造体のDummyAフィールドを更新するには、次のようにします。

func initProc2(v interface{}) error {

    if reflect.TypeOf(v).Kind() != reflect.Ptr {
        return fmt.Errorf("value must be a pointer")
    }

    dv := reflect.ValueOf(v).Elem()

    if dv.Kind() != reflect.Struct {
        return fmt.Errorf("value must be a pointer to a struct/interface")
    }

    const fname = "DummyA" // lookup field name

    f := dv.FieldByName(fname)

    if !f.CanSet() {
        return fmt.Errorf("value has no field %q or cannot be set", fname)
    }

    nv := reflect.ValueOf(dummyAFunc)

    f.Set(nv)

    return nil
}

実例:https//play.golang.org/p/VE751GtSGEw

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

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

編集
0

コメントを追加

0

関連記事

インターフェースを使用して具体的な構造体の値を設定する

GolangのReflectを使用して、インターフェイスを介して渡される構造体へのポインターを設定します{}

構造体に名前を付けずに、ポインターを使用して構造体内の構造体を構築する方法はありますか?

'reflect'を使用して定義済みの構造体を指すインターフェイスにデータを追加する

Golangはreflectを使用して構造体にnil文字列ポインター値を設定します

インターフェースとして渡される構造体の変数を設定します{}

リフレクトを使用して構造体内の構造体フィールドにアクセスする

構造体/インターフェースを使用してルートを構築する方法は?

最初の構造体を指すポインターを介して構造体内にある構造体を初期化する

インターフェイスを使用して2つの異なる構造体を結合する方法は?

C: 構造体へのポインターを別の構造体内の動的配列に格納する方法は?

ビルダーパターンを使用して、インターフェイスを動的に実装する構造体を構築する方法

構造体フィールドを設定してインターフェイスをスローする方法は?

Rustの関数に構造体(構造体インスタンスなし!)を要求して使用する方法は?

構造体インターフェースを同一の構造体に変換する

構造体へのポインタの配列を使用して、構造体の要素をランダムなdouble値に設定する

構造体にポインタの値を設定します

構造体内にあり、構造体が他の構造体の配列内にあるNULLへのポインターの配列を初期化する方法

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

構造体への構造体ポインタの値を設定します

構造体内の共用体を使用してC構造体にアクセスする方法

構造体をインターフェイスに割り当てる方法

インターフェイスで構造体の値を取得する

インターフェイスとして渡された構造体のフィールドを反射的に設定します{}

[]インターフェースを[]構造体に変換する方法

構造体または構造体へのポインタがインターフェイスを実装しているかどうかを知る方法

ポインタとして設定された構造体の構造体メンバーにアクセスする方法は?

インターフェイスを構造体に変換する方法

テストのために構造体/インターフェイスを使用して依存関係を模擬する方法

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    CSSのみを使用して三角形のアニメーションを作成する方法

  3. 3

    ZScalerと証明書の問題により、Dockerを使用できません

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    別のホストからTomcat Managerアプリにアクセスする

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Python / SciPyのピーク検出アルゴリズム

  9. 9

    MLでのデータ前処理の背後にある直感

  10. 10

    useRefに反応してコンポーネントをスクロールして表示する

  11. 11

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  12. 12

    パンダは異なる名前の列に追加します

  13. 13

    PictureBoxで画像のブレンドを無効にする

  14. 14

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  15. 15

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  16. 16

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  17. 17

    Material-UIでTextFieldエラーの色を条件付きでオーバーライドする方法

  18. 18

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  19. 19

    MatplotlibまたはSeabornを使用して、グループ化されたデータから複数のプロットを生成するにはどうすればよいですか?

  20. 20

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  21. 21

    Flutterにファイルピッカープラグインを追加するにはどうすればよいですか?

ホットタグ

アーカイブ