人!
我知道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")
}
但我认为这是错误的方式。
答案 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接口的非常简洁的解决方案。
答案 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