0
0

【Golang】参照型の初期値について

Posted at

Golangでは、
スライス(slice)、マップ(map)、チャネル(channel)などの参照型の変数は、デフォルトでnilとして初期化されます。
これは、 参照型が内部的にはポインタを持っており、nilはポインタが無効であることを示す ためです。そのため、関数がスライスを返す場合、そのスライスがnilであることは有効な状態であり、コンパイラはエラーを生成しません。

スライスの初期化

以下は、スライスを初期化し、それを返す関数の例です:

package main

import "fmt"

func main() {
    // 初期化
	var slice []int
 
	if slice == nil {
		fmt.Println("スライスはnilです")
	} else {
		fmt.Println("スライスはnilではありません")
	}
     // 結果: スライスはnilです

     fmt.Println(slice)
     // 結果: <nil>
}

マップの初期化

以下は、マップを初期化し、それを返す関数の例です:

package main

import "fmt"

func main() {
    // 初期化
	var m map[string]int

	if m == nil {
		fmt.Println("マップはnilです")
	} else {
		fmt.Println("マップはnilではありません")
	}
     // 結果: マップはnilです

     fmt.Println(m)
     // 結果: <nil>
}

makeを使用した初期化

makeによるスライスの初期化

package main

import "fmt"

func main() {
	// makeによるスライスの初期化
	slice := make([]int, 0)
 
	if slice == nil {
		fmt.Println("makeによって初期化したスライスはnilです")
	} else {
		fmt.Println("makeによって初期化したスライスはnilではありません")
	}
     // 結果: makeによって初期化したスライスはnilではありません

     fmt.Println(slice)
     // 結果: []
}

makeによるマップの初期化

package main

import "fmt"

func main() {
	// makeによるマップの初期化
	m := make(map[string]int)
 
	if m == nil {
		fmt.Println("makeによって初期化したマップはnilです")
	} else {
		fmt.Println("makeによって初期化したマップはnilではありません")
	}
     // 結果: makeによって初期化したマップはnilではありません

     fmt.Println(m)
     // 結果: map[]
}

まとめ

参照型の変数は、デフォルトでnilとして初期化
参照型が内部的にはポインタを持ち、nilはポインタが無効であることを示す

make関数を使用すると初期化はnilではなく空のスライスまたは空のマップとなる

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