元ネタ: javascript - Can (a ==1 && a== 2 && a==3) ever evaluate to true? - Stack Overflow
これに対する Qiita 記事のまとめが以下。
結論から言うと思いつきませんでした orz
理由は Go言語では演算子をオーバーライドできないし暗黙的な型変換もできないため。まともでないやり方なら何かあるかもしれないが思いつかなかった。
ただ Perl での解で
use strict;
use warnings;
my $a = 1;
my @a = (1, 2);
sub a { 3 };
if ($a == 1 and @a == 2 and &a == 3) {
print "True!\n";
}
というのを見かけたので,こういう記述が許容できるのなら何とかなりそうである。すなわち channel を使って
package main
import (
"fmt"
)
func main() {
a := make(chan int)
go func() {
for i := 1; ; i++ {
a <- i
i %= 3
}
}()
if <-a == 1 && <-a == 2 && <-a == 3 {
fmt.Println("True!")
}
if <-a == 1 && <-a == 2 && <-a == 3 {
fmt.Println("True!")
}
}
-
余談だが
a <- i
の<-
は channel への送信を表す送信構文(send statement)のトークンで for 構文内の<-a
の<-
は channel からの受信を表す受信演算子(receive operator)である。演算子なので式(expression)に含めることができる。 ↩