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ではなく空のスライスまたは空のマップとなる