(المسألة ذات الصلة: https://github.com/golang/go/issues/67190.)
في سلسلة أدوات Go من الإصدار v1.20 إلى v1.23.x، يوجد خطأ في مقارنة قيم القنوات، وهو موضَّح في البرنامج التالي:
// chan-cmp-bug.go
package main
import "fmt"
func main() {
x := make(chan struct{})
var y <-chan struct{} = x
switch x {
case y: fmt.Print(1)
default: fmt.Print(0)
}
switch y {
case x: fmt.Print(1)
default: fmt.Print(0)
}
fmt.Println(x == y)
}
ينبغي أن يطبع البرنامج 11true. لكنه يطبع 01true مع إصدارات سلسلة أدوات Go من v1.20 إلى v1.23.0 (حصريًا) [1].
$ gotv 1.19. run chan-cmp-bug.go
[Run]: $HOME/.cache/gotv/tag_go1.19.13/bin/go run chan-cmp-bug.go
11true
$ gotv 1.20 run chan-cmp-bug.go
[Run]: $HOME/.cache/gotv/tag_go1.20/bin/go run chan-cmp-bug.go
01true
$ gotv 1.21. run chan-cmp-bug.go
[Run]: $HOME/.cache/gotv/tag_go1.21.12/bin/go run chan-cmp-bug.go
01true
$ gotv 1.22. run chan-cmp-bug.go
[Run]: $HOME/.cache/gotv/tag_go1.22.5/bin/go run chan-cmp-bug.go
01true
$ gotv 1.23.0 run chan-cmp-bug.go
[Run]: $HOME/.cache/gotv/tag_go1.23rc1/bin/go run chan-cmp-bug.go
11true
بدأ الخطأ من إصدار سلسلة أدوات Go v1.20 وتم إصلاحه منذ v1.23.0.
إذا كنت تستخدم إصدارًا من سلسلة أدوات Go بين v1.20 وv1.23.0 (حصريًا)، فينبغي أن تكون على دراية بهذا الخطأ.
- GoTV (https://go101.org/apps-and-libs/gotv.html) أداة تُستخدم لتثبيت إصدارات متعايشة من سلسلة أدوات Go واستخدامها بانسجام. ↩︎