علل ومشكلات

خطأ في مقارنة القنوات عندما تُستخدم القنوات كتعبيرات case في كتل شيفرة switch (في سلسلة أدوات Go من الإصدار v1.20 إلى v1.23.x)

(المسألة ذات الصلة: 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 (حصريًا)، فينبغي أن تكون على دراية بهذا الخطأ.

  1. GoTV (https://go101.org/apps-and-libs/gotv.html) أداة تُستخدم لتثبيت إصدارات متعايشة من سلسلة أدوات Go واستخدامها بانسجام. ↩︎