当前位置: 首页 > 面试题库 >

在Go中验证结构的惯用方式?

周辰沛
2023-03-14
问题内容

我需要验证结构值是否正确,这意味着我需要单独检查每个字段,这对于少量的小型结构来说很容易,但是我想知道是否有更好的方法。这就是我现在的做法。

type Event struct {
    Id     int
    UserId int
    Start  time.Time
    End    time.Time
    Title  string
    Notes  string
}

func (e Event) IsValid() error {
    if e.Id <= 0 {
        return errors.New("Id must be greater than 0")
    }
    if e.UserId <= 0 {
        return errors.New("UserId must be greater than 0")
    }
    if e.End <= e.Start {
        return errors.New("End must be after Start")
    }
    if e.Start < time.Now() {
        return errors.New("Cannot create events in the past")
    }
    if e.Title == "" {
        return errors.New("Title cannot be empty")
    }
    return nil
}

这是验证结构中字段值的惯用方式吗?看起来很麻烦。


问题答案:

我认为没有其他方法可以快速完成此操作。但是我找到了一个可以帮助您的go软件包:https : //github.com/go-
validator/validator

README文件给出了以下示例:

type NewUserRequest struct {
    Username string `validator:"min=3,max=40,regexp=^[a-zA-Z]$"`
    Name string     `validator:"nonzero"`
    Age int         `validator:"min=21"`
    Password string `validator:"min=8"`
}

nur := NewUserRequest{Username: "something", Age: 20}
if valid, errs := validator.Validate(nur); !valid {
    // values not valid, deal with errors here
}


 类似资料:
  • 问题内容: 我在Go中编写解释器,并且正在寻找惯用的方式来存储AST。我阅读了Go编译器的源代码,似乎他们使用了带有空方法的接口来表示AST。例如,我们具有以下层次结构, 这就是上述层次结构以“空方法”方式实现的方式。 上面的代码是一个人为的示例,这就是Go编译器如何使用许多空方法来实现 AST的方式。但为什么?注意定义了多少个空方法。随着层次结构深度的增加,它可能会变得非常复杂。 注释中指出,空

  • 我有一个数据帧,其中有一列是JSON字符串 并且希望使用模式解析< code>from_json的< code>json_str列 正如人们所看到的,第二行不符合,因此即使我在StructField中将传递到它也是空的。对于我的管道来说,如果存在不符合所定义架构的数据,则会以某种方式引发警报,但我不确定在Pyspark中执行此操作的最佳方法。真正的数据有很多很多的键,其中一些是嵌套的,所以用某种形

  • 问题内容: 我试图代表一个简化的染色体,该染色体由N个碱基组成,每个碱基只能是的一个。 我想用一个枚举形式化约束,但是我想知道在Go语言中最惯用的枚举方式是什么。 问题答案: 引用语言规范:Iota 在常量声明中,预声明的标识符iota表示连续的无类型整数常量。每当保留字const出现在源中时,它将重置为0,并在每个ConstSpec之后递增。它可以用来构造一组相关的常量: 在Expression

  • 问题内容: 我正在看Go,它看起来很有前途。我试图弄清楚如何获得go结构的大小,例如 我当然知道它是24字节,但是我想以编程方式知道它。 您对如何执行此操作有任何想法吗? 问题答案: 注意: OP错误。unsafe.Sizeof确实在示例Coord3d结构上返回24。请参阅下面的评论。

  • 问题内容: 如果我要存储许多结构: 我可以用片来做,但是看起来使用更少的内存可以使用适当的set结构。 不幸的是,Go没有固定的结构。每个人都建议使用,但由于是结构,所以不起作用。有人有什么好的解决方案吗?理想情况下,无需下载库。 问题答案: 通常,设置和映射数据结构比将一组值存储在按设置的普通数组或切片中需要更多的内存,并且映射提供有效的附加功能,例如唯一性或通过键检索值。 如果要最小化内存使用

  • 问题内容: 我一直在玩Go,想知道在Go中执行惯用的类型转换的最佳方法是什么。基本上我的问题之间的自动类型转换中规定,和。根据我在其他语言中的经验,a 与a 的乘积会产生一个值,但并非总是如此。 这是我构建的示例,请问这是编写此代码的惯用方式还是缺少重要的语言构造。 在我看来,由于所有显式类型转换,计算上限值似乎不必要。 谢谢! 问题答案: 对于非常量值,没有隐式类型转换。 你可以写 但是你不能写