ある構造体のフィールドを別の構造体に更新します

David Pham:

私は構造体を持っています:

type Person struct {
    FirstName string
    LastName int
    Age int 
    HairColor string
    EyeColor string
    Height string
}

そして、2つのパラメーターを取り、最初のPersonのフィールドを2番目のPersonのフィールドに更新する関数があります。

func updateFields(personA *Person, personB Person) {
    personA.FirstName = personB.FirstName
    personA.LastName = personB.LastName
    // Don't want to change Age.
    personA.HairColor = personB.HairColor
    personA.EyeColor = personB.EyeColor 
    personA.Height = personB.Height

}

変更する値をハードコーディングする代わりに、フィールドをループして最初のPersonを更新し、「Age」フィールドを除いて2番目のPersonと同じ値にするにはどうすればよいですか?

ブルーノ・レイス:

すべてのフィールドを簡単にコピーするには、単純にのようなことができます*personA = personB特定のフィールドを1つだけコピーする必要がない場合(毎回同じフィールド)、そのフィールドの値を別の変数に保存し*personA = personB、ですべてをコピーしてから、値をコピーし直すことができます。しかし、これは非常に特定の状況でのみ役立ちます。たとえば、コピーしない動的なフィールドのセットを持つことはできません。

柔軟性を高めたい場合は、以下のリフレクションのサンプルコードを使用できます。

いくつかの制限があることに注意してください。特に、設定できるのはエクスポートされたフィールドのみです。また、これらの制限をテストせず、設定できないフィールドを設定したり、そのフィールドに割り当てられない型の値を設定したりすると、reflectパッケージは問題なく動作しpanicます。したがって、実際.Set(...)にフィールドの前に多数のチェックを追加するのが賢明です

import (
    "fmt"
    "reflect"
)

type Person struct {
    FirstName string
    LastName int
    Age int
    HairColor string
    EyeColor string
    Height string
}

func updateFields(personA *Person, personB Person) {
    // .Elem() called to dereference the pointer
    aVal := reflect.ValueOf(personA).Elem()
    aTyp := aVal.Type()

    // no .Elem() called here because it's not a pointer
    bVal := reflect.ValueOf(personB)

    for i := 0; i < aVal.NumField(); i++ {
        // skip the "Age" field:
        if aTyp.Field(i).Name == "Age" {
          continue
        }
        // you might want to add some checks here,
        // eg stuff like .CanSet(), to avoid panics
        aVal.Field(i).Set(bVal.Field(i))
    }
}

func main() {
    b := Person{
        FirstName: "Bruno",
        LastName:  1,
        Age:       2,
        HairColor: "hello",
        EyeColor:  "world",
        Height:    "tall",
    }
    a := Person{}
    fmt.Println(a)
    updateFields(&a, b)
    fmt.Println(a)
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

構造体配列からフィールドを抽出して、別の構造体配列に配置します

分類Dev

構造体のフィールドを更新するには?

分類Dev

構造体をフィールドの少ない別の構造体に変換する方法

分類Dev

Golangは他の構造体フィールドに任意の構造体を格納します

分類Dev

クロージャで別の構造体フィールドを借用しながら、1つの構造体フィールドを可変的に借用する

分類Dev

クロージャで別の構造体フィールドを借用しながら、1つの構造体フィールドを可変的に借用する

分類Dev

他の構造体のフィールドである構造体のメソッドを実行する方法

分類Dev

構造体フィールドを別の列Sparkと比較します

分類Dev

内部構造体を参照せずに、別の構造体内の構造体フィールドにアクセスする

分類Dev

GDBは構造体のフィールドを出力します

分類Dev

Golang:構造体のフィールドをループして変更し、構造体を返しますか?

分類Dev

構造体のフィールドを動的に取得する方法

分類Dev

メンバーの所有権をある構造体から別の構造体に移動しますか?

分類Dev

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

分類Dev

go構造体に空の構造体をフィールドとして持つ目的は何ですか?

分類Dev

構造体フィールドの型をJuliaの構造体自体と同じ型になるように宣言します

分類Dev

Matlabの構造体から別の構造体にフィールド値をエクスポートするにはどうすればよいですか?

分類Dev

C ++ / Qtの構造体のフィールドに文字列を変換する方法はありますか?

分類Dev

構造体を埋め込みますが、jsonには特定のフィールドしかありません

分類Dev

構造体フィールドを更新

分類Dev

golangの構造体フィールドを変更する方法

分類Dev

Cの構造体フィールドを列挙する

分類Dev

構造体の和集合で構造体の最初のフィールドにアクセスする

分類Dev

別の構造体の内部にある構造体を拡張する

分類Dev

Golangが別の構造体フィールドに構造体を割り当てているが機能しない

分類Dev

ユニオンフィールドを持つC構造体をGo構造体にマップします。

分類Dev

構造体フィールドを持つ構造体をc ++からc#pinvokeに返します

分類Dev

ある構造体から別の構造体に繰り返しサブ構造体をコピーするにはどうすればよいですか?

分類Dev

構造体フィールドのタイプを別の構造体フィールドのタイプで宣言する

Related 関連記事

  1. 1

    構造体配列からフィールドを抽出して、別の構造体配列に配置します

  2. 2

    構造体のフィールドを更新するには?

  3. 3

    構造体をフィールドの少ない別の構造体に変換する方法

  4. 4

    Golangは他の構造体フィールドに任意の構造体を格納します

  5. 5

    クロージャで別の構造体フィールドを借用しながら、1つの構造体フィールドを可変的に借用する

  6. 6

    クロージャで別の構造体フィールドを借用しながら、1つの構造体フィールドを可変的に借用する

  7. 7

    他の構造体のフィールドである構造体のメソッドを実行する方法

  8. 8

    構造体フィールドを別の列Sparkと比較します

  9. 9

    内部構造体を参照せずに、別の構造体内の構造体フィールドにアクセスする

  10. 10

    GDBは構造体のフィールドを出力します

  11. 11

    Golang:構造体のフィールドをループして変更し、構造体を返しますか?

  12. 12

    構造体のフィールドを動的に取得する方法

  13. 13

    メンバーの所有権をある構造体から別の構造体に移動しますか?

  14. 14

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

  15. 15

    go構造体に空の構造体をフィールドとして持つ目的は何ですか?

  16. 16

    構造体フィールドの型をJuliaの構造体自体と同じ型になるように宣言します

  17. 17

    Matlabの構造体から別の構造体にフィールド値をエクスポートするにはどうすればよいですか?

  18. 18

    C ++ / Qtの構造体のフィールドに文字列を変換する方法はありますか?

  19. 19

    構造体を埋め込みますが、jsonには特定のフィールドしかありません

  20. 20

    構造体フィールドを更新

  21. 21

    golangの構造体フィールドを変更する方法

  22. 22

    Cの構造体フィールドを列挙する

  23. 23

    構造体の和集合で構造体の最初のフィールドにアクセスする

  24. 24

    別の構造体の内部にある構造体を拡張する

  25. 25

    Golangが別の構造体フィールドに構造体を割り当てているが機能しない

  26. 26

    ユニオンフィールドを持つC構造体をGo構造体にマップします。

  27. 27

    構造体フィールドを持つ構造体をc ++からc#pinvokeに返します

  28. 28

    ある構造体から別の構造体に繰り返しサブ構造体をコピーするにはどうすればよいですか?

  29. 29

    構造体フィールドのタイプを別の構造体フィールドのタイプで宣言する

ホットタグ

アーカイブ