golangのchannelのバッファ満杯時のロックが処理の中断か確認する

 既に単位数少なくてギリギリなのに今日の試験事故って、留年まっしぐらなPiffettです。

golangのchannelではバッファ数を指定でき、これを超えるとき送信がロックされるだとかブロックされるとか書いてあります。おそらく処理が一時中断するのだと思うんですが、「ブロック」だったら処理毎破棄されそうですよね。確証がなかったので書いて確認。

package main

import (
    "fmt"
    "time"
)

func f(queue chan int) {
    i := 0
    for {
        fmt.Printf(".")
        time.Sleep(100 * time.Millisecond)
        i++
        if i > 11 {
            i = 0
            fmt.Println(<- queue)
        }
    }
}


func main() {


    queue := make(chan int, 3)

    go f(queue)
    queue <- 1

    queue <- 2

    queue <- 3

    // Lock
    queue <- 4

    for {
        fmt.Printf("x")
        time.Sleep(100 * time.Millisecond)
    }
}

結果

............x1
..x.x.x.x.x.xx..x.xx..xx2
..xx..xx.x.x..xx..xx..xx3
.x.x..xx..xx..xx..x.x.x4
.xx..xx.x.x..x.xx..x.xx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx→無限に続く

ということで確認終了。1を出力してからmain関数が動くと思ったら先にmain関数が動くのが意外でしたが、ちゃんと処理が中断されているだけだということが確認できました。なーむー