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

广告
将在 10 秒后关闭
bannerAds