如何限制Golang中的变量值?

时间:2016-11-09 10:02:47

标签: go

人!

我知道golang idiomatic没有setter和getter。但我需要限制Golang中变量的值。

我定义了新类型

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")
  }

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

不久前我问了同样的问题,公认的答案是实现Stringer接口的非常简洁的解决方案。

Create a custom type with constraint in Go

答案 2 :(得分:-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