【问题标题】:How can I restrict value of variables in Golang?如何限制 Golang 中变量的值?
【发布时间】:2016-11-09 10:02:47
【问题描述】:

我知道 Go 惯用的没有 setter 和 getter。但我需要限制 Go 中变量的值。

我定义了新类型

type MyNewStringType string

而定义为 MyStringType 的变量需要限制值。

MyStringType 的变量只能有 3 个值: “是”、“否”、“我不知道”

如何在 Golang 中做到这一点? 在Java、C++我都有setter和getter,但是在Golang中就不正常了。

我知道,我可以创造

type MyNewStringType struct {
   Variable string
}

并创建

func(m *MyNewStringType) SetVariable(newVar string) error {
  if newVar == "Yes" || newVar == "No" || newVar == "I don't know" {
    m.Variable = newVar
    return nil
  } else {
    return errors.New("Wrong value")
  }

但我认为这是错误的方式。

【问题讨论】:

标签: go


【解决方案1】:

实现这一点的更好方法是允许任何值,然后验证何时使用该值。一个简短的例子:

package main

import (
  "fmt"
  "os"
)

func main() {
  fmt.Println("First try")
  if err := doSomething("foo"); err != nil {
    fmt.Fprintf(os.Stderr, "%v\n", err)
  }

  fmt.Println()

  fmt.Println("Second try")
  if err := doSomething("Yes"); err != nil {
    fmt.Fprintf(os.Stderr, "%v\n", err)
  }
}

func doSomething(s string) error {
  switch s {
  case "Yes", "No", "I don't know":
    fmt.Println("Success!")
    return nil
  default:
    return fmt.Errorf("unsupported value: %q", s)
  }
}

输出:

First try
unsupported value: "foo"

Second try
Success!

https://play.golang.org/p/nt8J9wdlZkp

如果您坚持按照您建议的方式实现它,那么如果您使用上面示例中的switch 语句,您的SetVariable 方法可能会变得更加整洁。

【讨论】:

    【解决方案2】:

    短遮阳篷:

    type MyString string
    const (
        YES MyString = "yes"
        NO = "no"
        DONTKNOW = "i dont know"
    )
    
    func foo(arg MyString){
        fmt.Print(arg)
    }
    
    foo(YES) //success, prints "yes"
    
    foo("jop") //fails to compile
    

    【讨论】:

    • 这实际上并不能解决问题。在foo("jop") 的情况下"jop" 将是MyString 类型的情况,所以它会编译。
    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2020-09-16
    • 2021-08-10
    相关资源
    最近更新 更多