【问题标题】:Does type definition help assign restricted values?类型定义是否有助于分配受限值?
【发布时间】:2021-06-14 17:27:11
【问题描述】:

在下面的结构类型中:

type Employee struct {
    Name         string          `json:"name"`
    JobTitle     JobTitleType    `json:"jobtitle"`
}

应确保成员JobTitle 具有受限(特定)值(字符串类型)。

type JobTitleType string

const(
     GradeATitle JobTitleType = "Clerk"
     GradeBTitle JobTitleType = "Manager"
)

类型定义(JobTitleType) 是否有助于将受限值分配给成员JobTitle

【问题讨论】:

标签: go


【解决方案1】:

没有。您可以为 JobTitle 分配任何值:

e.JobTitle=JobTitleType("bogus")

JobTitleType是基于字符串的,所以所有的字符串值都可以转换成它。

您可以使用 getter/setter 来强制执行运行时验证。

【讨论】:

  • 我们有 getter 和 setter,我需要将 JobTitle 设为小写成员(jobTitle)以不直接分配成员,但是,这将不允许序列化数据。如何强制只通过setter赋值?
  • 保持导出。没有硬性保证该值有效。
  • 导出成员会使 getter/setter 变得多余。
【解决方案2】:

不,它不会限制值,任何类型为JobTitleType 的值都可以分配给 JobTitle。目前,Go 中没有 enum 类型。对于限制值,您可能需要编写自己的逻辑。

【讨论】:

    【解决方案3】:

    不,您应该在验证逻辑中使用它。例如,https://github.com/go-playground/validatoroneOf 运算符用于验证。

    Go 没有 enum 类型,但你可以这样做

    package main
    
    import (
        "fmt"
    )
    
    var JobTitleTypes = newJobTitleTypeRegistry()
    
    func newJobTitleTypeRegistry() *jobTitleTypeRegistry{
        return &jobTitleTypeRegistry{
            GradeATitle :  "Clerk",
            GradeBTitle : "Manager",
        }
    }
    
    type jobTitleTypeRegistrystruct {
        GradeATitle string
        GradeBTitle string
    }
    
    func main() {
        fmt.Println(JobTitleTypes.GradeATitle)
    }
    

    【讨论】:

    • 这种hacky方法(jobTitleTypeRegistry)看起来更好,而不是验证器
    • 如何将SourceTypes的值赋给structEmployee的成员?
    猜你喜欢
    • 2016-01-18
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2018-10-27
    • 2018-09-17
    • 2010-10-13
    相关资源
    最近更新 更多