2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Goでerrors.New()の値を比較するテストでイコールにならない

Last updated at Posted at 2022-08-26

はじめに

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 Newreturn &errorString{text}が返ってきます
ポインタが返却されていました

変数を別に定義するとそれぞれポインタが変わるのでポイント同士の比較はエラーになるのは当然でした

おわりに

ここに気付くのにかなりいろいろな英語の記事を読みました
あたりまえのことなのかあまり触れられている記事がなかったため原因にたどり着くのに時間がかかりましたが、やっとテストが通るようになってよかったです

これからどんどんテストを書いていきたいです

参考

2
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?