はじめに
Goを始めたばかりでAPIを一つ作成してテストに挑戦したところかなり沼ってしまいました
原因を解明するのにかなり時間がかかってしまったので初心者のためにまとめます
自分が探していた情報がある記事がなかったので(仕組みを知っているならあたりまえの理由だった)、役に立てばと思います
問題
main.go
package main
import (
"errors"
"fmt"
)
func main() {
err1 := errors.New("error")
err2 := errors.New("error")
fmt.Println(err1 == err2)
}
この結果がfalse
になってしまうのが理解できずにテストでも同じような比較をしていたのでテストが通らず困りました
解決方法
これはerrors.New
の処理をみれば納得できます
func New(text string) error {
return &errorString{text}
}
// errorString is a trivial implementation of error.
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
erros.Newを呼び出すとfunc New
でreturn &errorString{text}
が返ってきます
ポインタが返却されていました
変数を別に定義するとそれぞれポインタが変わるのでポイント同士の比較はエラーになるのは当然でした
おわりに
ここに気付くのにかなりいろいろな英語の記事を読みました
あたりまえのことなのかあまり触れられている記事がなかったため原因にたどり着くのに時間がかかりましたが、やっとテストが通るようになってよかったです
これからどんどんテストを書いていきたいです
参考