Heim  >  Artikel  >  Backend-Entwicklung  >  Go Reflection Aktuellen Feldnamen abrufen, aber Fehler bei untypisierter Zeichenfolge mit nicht übereinstimmenden Typen

Go Reflection Aktuellen Feldnamen abrufen, aber Fehler bei untypisierter Zeichenfolge mit nicht übereinstimmenden Typen

WBOY
WBOYnach vorne
2024-02-06 10:30:04599Durchsuche

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

问题内容

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
}

在上面的代码中,一行:

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

我想在错误消息中包含当前字段的名称。

这是我收到的错误:

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

我也尝试过这个:

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

但我明白了:

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

我也尝试过这个:

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

但我明白了:

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

有人能给我指出正确的方向或提供解决方案吗?谢谢!


正确答案


从类型中获取StructField。从 StructField 获取字段名称

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

Das obige ist der detaillierte Inhalt vonGo Reflection Aktuellen Feldnamen abrufen, aber Fehler bei untypisierter Zeichenfolge mit nicht übereinstimmenden Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen