ポインタとエラーを返す時どちらかがnilであれば他方はnot nil

Goとエラーハンドリング慣習について』を読んでコードを修正した。

修正した箇所は

という点に該当する箇所。

当初 API を設計したときは対象オブジェクトが見つからないことをエラー扱いしたくなかったので return nil, nil にしていたのだが

Gopherはエラーがnilじゃないならもう一方が有効な値であることを期待します。例えばnot-foundなエラーを返すほうが誤解されないかと。

とのことなので、Go の慣習に合わせることにした。

ただ推奨例として書かれている

func FindObjects(name string) ([]*Object, error) {
	objects := []*Object{}
	...
	return objects, nil
}

というのはやりたくなかった。
常に一つのオブジェクトしか返さないのに、見つからなかった場合のことを想定してわざわざ配列を返すことにはしたくない。

そのためオブジェクトが見つからなかったというエラーを返すことにした。
今回はフロント側へ影響を出したくなかったので最終的にフロントに返す段階で return nil, nil にするようにしているのだが、ID なり何なりを指定してオブジェクトを指定する API でオブジェクトが見つからないのはエラーでいいかもしれない。

 

「カスタムエラーは極力作らない」というのも後でやっておきたい。
スタックトレースを書き出すための戦略として『今goのエラーハンドリングを無難にしておく方法(2021.09現在)』という記事を参考にして実装したつもりだったが、今ちゃんとできてなくてスタックトレースを完全に出せていない疑惑もある。そのあたりも直す。

以上