Невозможно обновить существующее поле структуры - PullRequest
0 голосов
/ 31 октября 2019

Я создал структуру Casedetail1 в том смысле, что у меня есть другие детали набора структур. Мне нужно обновить KitStatus и KitOwner при передаче обновленного значения из основной функции. После обновления вложенной структуры я пытаюсь получить родительскую структуру (Casedetail1), чтобы увидеть обновленный вывод. При попытке запустить приведенный ниже код на детской площадке он выдает { []} в качестве вывода. Я не получаю значения.

package main

import (
    "fmt"
    "reflect"
)
type CaseDetails1 struct {

   ObjectType        string         `json:"docType"`
   CaseID            string         `json:"caseID"`
   CaseStatus        string         `json:"caseStatus"`
   KitDetails       []Kit_Details  `json:"kit_Details"`
}
type Kit_Details struct {
    KitID          string    `json:"kitID"`
    KitStatus      string    `json:"kitStatus"`
    KitTimestamp   string    `json:"kittimestamp"`
    KitSerialID    string    `json:"kitSerialID"`
    KitOwner       string    `json:"kitOwner"`
}

// Function to update existing field of a nested struct
func method(existingEntity interface{}, newEntity interface{}) {
    entityType := reflect.TypeOf(existingEntity).Elem()
    for i := 0; i < entityType.NumField(); i++ {
        value := entityType.Field(i)
         value1 := entityType.Field(i).Name
         fmt.Println(value1)
        tag := value.Tag
        if tag.Get("readonly") == "true" {
            continue
        }
        oldField := reflect.ValueOf(existingEntity).Elem().Field(i)
        newField := reflect.ValueOf(newEntity).FieldByName(value.Name)

             //fmt.Println(newField)
          if value.Type.Kind() == reflect.Struct {
            method(oldField.Addr().Interface(), newField.Interface())
          } else {
                if value1 == "KitStatus" || value1 == "KitTimestamp" {
                fmt.Println(value1)
            oldField.Set(newField)
            }
         }


    }
}

func main() {
    var a CaseDetails1
    b := CaseDetails1{"casedetails", "456", "OPEN", []Kit_Details{Kit_Details{"789", 
                       "IN_PROGRESS","2019-10-30","345","HOSPITAL"},},}
    method(&a, b)
    fmt.Println(a)
}
...