Maison  >  Article  >  développement back-end  >  Go Reflection Obtenez le nom du champ actuel mais une erreur sur une chaîne non typée avec des types incompatibles

Go Reflection Obtenez le nom du champ actuel mais une erreur sur une chaîne non typée avec des types incompatibles

WBOY
WBOYavant
2024-02-06 10:30:04641parcourir

Go Reflection 获取当前字段名称,但在类型不匹配的非类型字符串上出现错误

Contenu des questions

type Issue struct {
  SysId  uuid.UUID  `json:"sysid" maelstrom:"required"`
}

func (i *Issue) Unmarshal(data []byte) error {
  err := json.Unmarshal(data, i)
  if err != nil {
    slog.Error(err.Error())
    return err
  }
  fields := reflect.ValueOf(i).Elem()
  for i := 0; i < fields.NumField(); i++ {
    maelstromTags := fields.Type().Field(i).Tag.Get("maelstrom")
    if strings.Contains(maelstromTags, "required") && fields.Field(i).IsZero() {
      return errors.New("Required field is missing." + fields.Field(i))
    }
  }
  return nil
}

Dans le code ci-dessus, la ligne :

return errors.New("Required field is missing." + fields.Field(i))

Je souhaite inclure le nom du champ actuel dans le message d'erreur.

Voici l'erreur que je reçois :

<code>
invalid operation: "Required field is missing." + fields.Field(i) (mismatched types untyped string and reflect.Value)
</code>

J'ai aussi essayé ceci :

return errors.New("Required field is missing." + fields.Field(i).String)

Mais je comprends :

<code>
invalid operation: "Required field is missing." + fields.Field(i).String (mismatched types untyped string and func() string)
</code>

J'ai aussi essayé ceci :

return errors.New("Required field is missing." + string(fields.Field(i)))

Mais je comprends :

<code>
cannot convert fields.Field(i) (value of type reflect.Value) to type string [InvalidConversion]
</code>

Quelqu'un peut-il m'orienter dans la bonne direction ou me proposer une solution ? Merci!


La bonne réponse


est obtenue à partir du type StructField. Obtenez le nom du champ auprès de StructField.

return fmt.Errorf("required field is missing: %s", fields.Type().Field(i).Name)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer