【参考資料】
- Effective Go: Constants
- [Golang] array と slice と map を定数として使えない
- go - Declare a constant array - Stack Overflow
【実行環境】
- Go for Windows:1.18
理由
定数として使えるのは「数字」「文字(runes含む)」「boolean」であり、定数はコンパイル時に生成されます。
対して配列やスライスはプログラム実行時に生成されます。
代用策
1: [要素数]string(またはint){要素1,要素2,・・・} 形式で定義。
- Pros: 直観的で、行数も少なくて済む。
- Cons: 結局は変数なので、簡単に内容が変更できてしまう。
- (補) [要素数]のところは[...]でも良い。
コード例:
main.go
var TestArray = [4]string{"Alpha","Bravo","Charlie","Delta"}
// ただし内容変更できてしまう
TestArray[3] = "Foxtrot"
fmt.Printf("%v \n", TestArray) // 結果:[Alpha Bravo Charlie Foxtrot]
2: Getterメソッドのように関数として定義する。
- Pros: 関数を呼ぶだけなので扱いが楽になる。
- Cons: コード量が増加してしまう。変数のため変更可能なのは変わりはない。
コード例:
main.go
const TM01 = "team1"
const TM02 = "team2"
func main() {
fmt.Printf("%v \n", getArray(TM01)) // 結果[Alpha Bravo]
fmt.Printf("%v \n", getArray(TM02)) // 結果[Charlie Delta]
}
func getArray(key string) []string {
switch key {
case TM01:
return []string{"Alpha","Bravo"}
case TM02:
return []string{"Charlie","Delta"}
default:
return []string{}
}
}
PHP脳になってしまうと、ついつい配列の定数化やin_array()などが思い浮かんでしまいますが、
静的型付け言語のおかげで目が覚めました。