hash/maphash: hash channels in purego version of maphash.Comparable

This change makes purego implementation of maphash.Comparable consistent
with the one in runtime and fixes hashing of channels.

Fixes #73657

Change-Id: If78a21d996f0c20c0224d4014e4a4177b09c3aa3
GitHub-Last-Rev: 2537216a1e
GitHub-Pull-Request: golang/go#73660
Reviewed-on: https://go-review.googlesource.com/c/go/+/671655
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: qiu laidongfeng2 <2645477756@qq.com>
This commit is contained in:
Vladislav Yarmak 2025-05-10 17:58:48 +00:00 committed by Sean Liao
parent b69f50faef
commit 1635aed941
2 changed files with 6 additions and 1 deletions

View File

@ -161,7 +161,7 @@ func appendT(h *Hash, v reflect.Value) {
case reflect.Bool:
h.WriteByte(btoi(v.Bool()))
return
case reflect.UnsafePointer, reflect.Pointer:
case reflect.UnsafePointer, reflect.Pointer, reflect.Chan:
var buf [8]byte
// because pointing to the abi.Escape call in comparableReady,
// So this is ok to hash pointer,

View File

@ -254,12 +254,17 @@ func TestComparable(t *testing.T) {
}
testComparable(t, s1, s2)
testComparable(t, s1.s, s2.s)
c1 := make(chan struct{})
c2 := make(chan struct{})
testComparable(t, c1, c1)
testComparable(t, chan struct{}(nil))
testComparable(t, float32(0), negativeZero[float32]())
testComparable(t, float64(0), negativeZero[float64]())
testComparableNoEqual(t, math.NaN(), math.NaN())
testComparableNoEqual(t, [2]string{"a", ""}, [2]string{"", "a"})
testComparableNoEqual(t, struct{ a, b string }{"foo", ""}, struct{ a, b string }{"", "foo"})
testComparableNoEqual(t, struct{ a, b any }{int(0), struct{}{}}, struct{ a, b any }{struct{}{}, int(0)})
testComparableNoEqual(t, c1, c2)
}
func testComparableNoEqual[T comparable](t *testing.T, v1, v2 T) {