Go
golang
StackOverflow

Go 言語でも (a==1 && a==2 && a==3) を true にしてみたい(クソリプ編)

元ネタ: 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!")
    }
}

すればよい 1。お後がよろしいようで。


  1. 余談だが a <- i<- は channel への送信を表す送信構文(send statement)のトークンで for 構文内の <-a<- は channel からの受信を表す受信演算子(receive operator)である。演算子なので式(expression)に含めることができる。