第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將一個結(jié)構(gòu)的字段更新為另一個結(jié)構(gòu)

將一個結(jié)構(gòu)的字段更新為另一個結(jié)構(gòu)

Go
斯蒂芬大帝 2022-06-06 17:57:45
我有一個結(jié)構(gòu):type Person struct {    FirstName string    LastName int    Age int     HairColor string    EyeColor string    Height string}我有一個接受 2 個參數(shù)的函數(shù),并將第一個人的字段更新為第二個人的字段: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 以使其具有與第二個 Person 相同的值,但“Age”字段除外?
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻1725條經(jīng)驗 獲得超8個贊

您可以在之前將整個復制personB到personA并備份該Age字段:


func updateFields(personA *Person, personB Person) {

    tempAge := personA.Age

    *personA = personB

    personA.Age = tempAge

}


查看完整回答
反對 回復 2022-06-06
?
尚方寶劍之說

TA貢獻1788條經(jīng)驗 獲得超4個贊

為了簡單地復制每個字段,您可以簡單地執(zhí)行類似*personA = personB. 如果您只需要“不復制”一個特定字段(每次都是相同的字段),您可能只需將該字段的值保存在一個單獨的變量中,使用 復制所有內(nèi)容*personA = personB,然后將值復制回來。但這僅對非常特定的情況有用。例如,它不允許有一組不復制的動態(tài)字段。


如果你想更靈活地做到這一點,你可以使用反射來做到這一點,下面的示例代碼。


請注意,可能存在一些限制。值得注意的是,您只能設置導出的字段。此外,如果您不測試這些限制并且不小心嘗試設置一個不可設置的字段,或者使用不可分配給該字段的類型值等,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)

}


查看完整回答
反對 回復 2022-06-06
  • 2 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號