naofunky
@naofunky

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Go言語でtime.Time型での比較演算子を用いた時のエラーについて

Q&A

解決したいこと

time.Time型のデータを扱った際に比較演算子を用いた場合、扱えないと調べていたら出てきました。逆にこのエラーを出したいところなんですが、出てこないので発現するようにしたい。
そもそも、比較演算子を用いた処理はコンパイルエラーは起きないなどご教示いただきたいです。

発生している問題・エラー

"t1 is not equal to t2"

コンソールに出力される内容は上記の テキストです。

該当するソースコード

main.go
type MyTime struct {
	t time.Time
}

func main() {
	t1 := MyTime{t: time.Now()}
	t2 := MyTime{t: time.Now()}

    if t1 == t2 {
		fmt.Println("t1 is equal to t2")
	} else {
		fmt.Println("t1 is not equal to t2")
	}
}

自分で試したこと

 故意的に変数t1と変数t2を比較演算子を用いて実行しました。自身の予測では、time.Time型のデータは比較演算子が扱えないのならコンパイルエラーが発生するのではないかと予想しました。しかし、上記のコードを実行すると、処理が実行されコンソールが出ました。
 以上から、自身の理解でtime.Time型のデータで比較演算子が使えてしまっている。認識になってしまっています。使用することはできないことを実践するにはどのような記述をすればいいでしょうか。

ご教示いただければ、幸いです。

0

1Answer

結論

コンパイルエラーは起きないです。
==は仕様上は使えますが、おそらく望んだ結果にはならないので「実用的ではない」という意味で使えません。

詳細

time.Timeは構造体です。
Goの構造体に対する==はすべてのフィールドが等しいかの比較となります。
どこに記載があったものかわかりませんが、「比較演算子が扱えない」の意図はフィールドlocが参照アドレスを保持する値であり、同じ参照ではないと一致しないので、==での比較は無意味であるというものだと思います。

type Time struct {
  wall uint64
  ext  int64
  loc  *Location
}
4Like

Comments

  1. @naofunky

    Questioner

    ご教示いただきありがとうございます。

    コンパイルエラー自体は起こらないのですね。
    また、補足した内容についてもわかりやすく、本当の意図がわかりました。

    ↓参考にした記事
    https://text.baldanders.info/golang/order-by-time/

Your answer might help someone💌