缺乏对数组常量的支持的解决方法?

时间:2017-06-05 18:44:54

标签: arrays go initialization idioms

Go没有数组常量。

我的应用程序接收包含几种类型的数字代码的消息,我需要将其显示为短语。

如果存在阵列含量,我可以执行以下操作:

func foo() {
   ...
   fmt.Println(facename[f])
   ...
}
const facename [...]string = "top", "bottom", "left", "right", "front", "back"

但当然没有办法做到这一点。我想到的第一种方法是使用switch

,这可能是一个合理有效的方法
func foo() {
   ...
   name := "unknown"
   switch f {
   case 0:
      name = "top"
   case 1:
      name = "bottom"
   case 2:
      name = "left"
   case 3:
      name = "right"
   case 4:
      name = "front"
   case 5:
      name = "back"
   }
   fmt.Println(name)
   ...
}

如果值的数量达到20或更多,则上述相当繁琐。

似乎最简洁的方式就像

func foo() {
   ...
   fmt.Println(strings.Split(facenames,",")[f])
   ...
}
const facenames = "top,bottom,left,right,front,back"

我还必须检查索引是否在范围内。 虽然效率目前不是一个问题,但它让我感到困惑 我使用strings.Split()比我想要的更多。

还有另一种方式是惯用还是既简洁又有效?

2 个答案:

答案 0 :(得分:2)

惯用法是使用包级变量:

var facename = []string{"top", "bottom", "left", "right", "front", "back"}

func foo() {
    // ...
    fmt.Println(facename[f])
    // ...
}

在这种情况下使用切片而不是数组也是惯用的。

答案 1 :(得分:0)

它可能不太适合,但它出现你的用例基本上是一个字符串等效的枚举。为此,我通常采取以下措施:

CustomPlayview