结构标签是否向 API 用户抛出错误?

Do struct tags throw error to the API user?

type Person struct {
  Id       string
  Roll_no  int
  Email    string  `json:"email" validate:"required"`
}

这里的电子邮件是必需的。如果用户没有在 API 调用的请求正文中提供,如果没有提供此字段,Go 会自动处理名称验证并抛出错误吗?或者我需要在我的代码中手动验证它并以某种形式的 http 状态代码抛出错误?

如果通过 API 发送的 JSON 不包含 Email 那么 encoding/json json.Unmarshal 将把它当作 Email空字符串。

选项 A:如果空字符串不是有效的 Email,您可以在 json.Unmarshal

之后检查空字符串
    var person Person
    
    err := json.Unmarshal(jsonBlob, &person)
    if err != nil{
        return err
    }
    
    if person.Email == "" {
        return errors.New("email cannon be empty"
    }

选项 B:如果空字符串有效,您可以创建自定义 MarshalJSON 以将 JSON 解析为字符串并查找 Email 键。

https://pkg.go.dev/encoding/json#example-package-CustomMarshalJSON

Do struct tags throw error to the API user?

没有。原因很多。

  1. 一些结构标签(例如 json 标签)仅被包 encoding/json 用于在 JSON 对象元素和结构字段之间进行映射。

  2. 某些第 3 方包使用其他结构标记(如验证),如果您不使用该包,则什么也不会发生。

  3. Go(语言及其标准库)“没有魔法”。没有什么神奇的事情发生。如果您需要在 API 端点上进行验证,您可以使用检查结构标签的验证包,但这不会神奇地发生:您必须自己调用这些函数和 return 一个 API 错误。不,我不会在这里推荐框架。

  4. 要工作,结构标签必须有效,none 是。 运行 go vet 查找此类问题。 (应该是 json:"emal" validate:"required" 甚至可能是“电子邮件”)

  5. Go 中的错误根本不会“抛出”。特别是状态代码为 400 Bad Request 的 HTTP 响应不会被“抛出”。正确使用术语总是有帮助的。