0
0

【Go】エラーの場合は返り値として空の構造体を返す?nilを返す?

Posted at

はじめに

以下のようなコードで、err != nilのとき、

ある関数ではmodels.Article{}と空の構造体を返しているのに対し、

func PostArticleService(article models.Article) (models.Article, error) {
    // 略
	newArticle, err := repositories.InsertArticle(db, article)
	if err != nil {
		return models.Article{}, err
	}

	return newArticle, err
}

別の関数では(空のスライス[]models.Article{}ではなくnilを返しています。

func GetArticleListService(page int) ([]models.Article, error) {
    // 略
    
	articleList, err := repositories.SelectArticleList(db, page)
	if err != nil {
		return nil, err
	}
	return articleList, err
}

この相違点がなぜ生まれるのか気になり、調べました。

空の構造体を返す場合

まず、1つ目の関数ではなぜnilではなく空の構造体を返しているのかを考えます

nilについては以下のように説明されています。

nil(ニル)はGoで事前に定義された識別子で、ポインタ、インターフェイス、マップ、スライス、チャネル、関数型などのゼロ値を表します。

つまり、nilは参照型のゼロ値を表すのに使うものであり、値型である構造体のゼロ値は表せないようです。

したがって、構造体のゼロ値を表すには、models.Article{}のように表記するしかありません。

func PostArticleService(article models.Article) (models.Article, error) {
    // 略
	newArticle, err := repositories.InsertArticle(db, article)
	if err != nil {
		return models.Article{}, err
	}

	return newArticle, err
}

nilを返す場合

上記の通りnilは参照型のゼロ値を表すのに使うものなので、返り値の型がスライスならnilを返します。

func GetArticleListService(page int) ([]models.Article, error) {
    // 略
    
	articleList, err := repositories.SelectArticleList(db, page)
	if err != nil {
		return nil, err
	}
	return articleList, err
}

ちなみに、空のスライス[]models.Article{}を返してもエラーにはなりませんが、そうするとエラーではなくデータが存在しないことを表すので、エラーの有無がわかりにくくなってしまい、推奨されないようです。

おわりに

ふと気になって調べたのですが、Goの理解が深まりました。

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