見出し画像

golang データ型ごとのnillの判定方法と注意点にいて

今回はgolangのnilの判定を行う方法をデータ型ごとに紹介していきます。

nilは主にポインタ、スライス、マップ、チャネル、インタフェース、関数型のゼロ値として使用されます。
これらが本当にnilかどうか判定する方法とその際に気を付けることを書いていきます。

ポインタ型のnil判定

ポインタ型の変数がnilかどうかは、直接比較で判定できます。

var a *xxxxx
if a == nil {
    fmt.Println("ポインタはnilです")
}

関数からのポインタの戻り値をチェックする際には、その関数が有効なポインタを返すかどうかを確認する必要があります。


スライス、マップ、チャネルのnil判定

スライス、マップ、チャネルが参照型のためnilで初期化することができます。

var a []int
if a == nil {
    fmt.Println("スライスはnilです")
}
var a map[string]int
if a == nil {
    fmt.Println("マップはnilです")
}
var a chan int
if a == nil {
    fmt.Println("チャネルはnilです")
}

しかし空のスライス、マップ、チャネルとnilは異なります。

空のスライスは[]int{}、空のマップはmap[string]int{}と表記されるためnilではありません。

スライス、マップ、チャネルが初期化されているかどうかをチェックする場合は、nilかどうかにプラスして長さをlen()関数を用いてチェックすることが一般的です。

var a []int

if len(a) == 0 {
  fmt.Println("スライスは空です")
  } else {
      fmt.Println("スライスには要素が含まれています")
  }

空のスライスaが初期化されているため、len(a) == 0でその長さが0かどうかをチェックしています。今回はこの条件が真のため「スライスは空です」が出力されます。


インターフェイス型のnil判定

インターフェイスがnilかどうかは直接比較して判定することができます。

var a interface{}
if a == nil {
    fmt.Println("インターフェイスはnilです")
}

しかしインターフェイス型に格納されている値がnilであっても、インターフェイス自体がnilではない可能性があります。

そのため、インターフェイスが具体的に型を参照しているかをチェックする必要があります。

var a interface{} = (*Xxxxxxx)(nil)
if a != nil {
    fmt.Println("インターフェイスはnilではありません")
}


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。

この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?