How can I restrict value of variables in Golang?

huangapple go评论107阅读模式
英文:

How can I restrict value of variables in Golang?

问题

我知道Go语言中没有setter和getter的惯用方式。但是我需要在Go中限制变量的值。

我定义了一个新类型:

  1. type MyNewStringType string

需要限制值的变量被定义为MyStringType类型。

MyStringType类型的变量只能有三个值:"Yes"、"No"、"I don't know"。

在Golang中,我该如何实现呢?
在Java和C++中,我可以使用setter和getter,但在Golang中不太一样。

我知道,我可以创建以下结构体:

  1. type MyNewStringType struct {
  2. Variable string
  3. }

然后创建以下函数:

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

但我认为这种方式不太对。

英文:

I know Go idiomatic don't have setter and getter. But I need to restrict value of variables in Go.

I defined new type

  1. type MyNewStringType string

And variables, that was defined as MyStringType, need to restrict value.

Variables of MyStringType can have only 3 values:
"Yes", "No", "I don't know"

How can I do it in Golang?
In Java, C++ I have setter and getter, but in Golang is not normal.

I know, I can create

  1. type MyNewStringType struct {
  2. Variable string
  3. }

and create

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

But I think it's wrong way.

答案1

得分: 0

这个更好的实现方式可以是允许任何值,并在使用该值时进行验证。以下是一个简短的示例:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. fmt.Println("第一次尝试")
  8. if err := doSomething("foo"); err != nil {
  9. fmt.Fprintf(os.Stderr, "%v\n", err)
  10. }
  11. fmt.Println()
  12. fmt.Println("第二次尝试")
  13. if err := doSomething("Yes"); err != nil {
  14. fmt.Fprintf(os.Stderr, "%v\n", err)
  15. }
  16. }
  17. func doSomething(s string) error {
  18. switch s {
  19. case "Yes", "No", "I don't know":
  20. fmt.Println("成功!")
  21. return nil
  22. default:
  23. return fmt.Errorf("不支持的值:%q", s)
  24. }
  25. }

输出结果:

  1. 第一次尝试
  2. 不支持的值:"foo"
  3. 第二次尝试
  4. 成功!
  5. [代码链接](https://play.golang.org/p/nt8J9wdlZkp)
  6. 如果你坚持按照你提出的方式实现,也许你的`SetVariable`方法会变得更整洁一些,就像上面的示例中使用`switch`语句一样。
  7. <details>
  8. <summary>英文:</summary>
  9. A nicer way of implementing this could be to allow any value, and then validating when the value is used. A short example:
  10. package main
  11. import (
  12. &quot;fmt&quot;
  13. &quot;os&quot;
  14. )
  15. func main() {
  16. fmt.Println(&quot;First try&quot;)
  17. if err := doSomething(&quot;foo&quot;); err != nil {
  18. fmt.Fprintf(os.Stderr, &quot;%v\n&quot;, err)
  19. }
  20. fmt.Println()
  21. fmt.Println(&quot;Second try&quot;)
  22. if err := doSomething(&quot;Yes&quot;); err != nil {
  23. fmt.Fprintf(os.Stderr, &quot;%v\n&quot;, err)
  24. }
  25. }
  26. func doSomething(s string) error {
  27. switch s {
  28. case &quot;Yes&quot;, &quot;No&quot;, &quot;I don&#39;t know&quot;:
  29. fmt.Println(&quot;Success!&quot;)
  30. return nil
  31. default:
  32. return fmt.Errorf(&quot;unsupported value: %q&quot;, s)
  33. }
  34. }
  35. Output:
  36. First try
  37. unsupported value: &quot;foo&quot;
  38. Second try
  39. Success!
  40. https://play.golang.org/p/nt8J9wdlZkp
  41. If you insist on implementing it in the way you suggest, perhaps your `SetVariable` method would become a little bit tidier if you used a `switch` statement as in the above example.
  42. </details>
  43. # 答案2
  44. **得分**: -5
  45. 翻译结果:
  46. 简短回答:
  47. type MyString string
  48. const (
  49. YES MyString = "yes"
  50. NO = "no"
  51. DONTKNOW = "i dont know"
  52. )
  53. func foo(arg MyString){
  54. fmt.Print(arg)
  55. }
  56. foo(YES) //成功,输出"yes"
  57. foo("jop") //编译失败
  58. <details>
  59. <summary>英文:</summary>
  60. Short awnser:
  61. type MyString string
  62. const (
  63. YES MyString = &quot;yes&quot;
  64. NO = &quot;no&quot;
  65. DONTKNOW = &quot;i dont know&quot;
  66. )
  67. func foo(arg MyString){
  68. fmt.Print(arg)
  69. }
  70. foo(YES) //success, prints &quot;yes&quot;
  71. foo(&quot;jop&quot;) //fails to compile
  72. </details>

huangapple
  • 本文由 发表于 2016年11月9日 18:02:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/40504253.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定