0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-06-07

【参考資料】

【実行環境】

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

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0