LoginSignup
0

posted at

updated at

[golang] Go言語は、map、slice、arrayは定数化出来ない仕様。では代用策は?

【参考資料】

【実行環境】

  • 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()などが思い浮かんでしまいますが、
静的型付け言語のおかげで目が覚めました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0