📚

goのチャンネルに関する云々

2020/10/27に公開

あれ?関数抜けたらチャンネルって解放されるんだっけ?
と思ったので検証してみました。

package main

import "fmt"

func main() {
	ch := make(chan string)
	go hoge(ch)
	<-ch
}
func hoge(ch chan<- string) {
	fmt.Println("channel")
	ch <- "move"
}

これは簡単ですね、「channel」って出て終わりです。

問題はchが関数を抜けた後も生きているのか?その後の関数を呼べるのか?って言うことです。
つまりこんな感じです。

package main

import (
	"fmt"
	"time"
)

func main() {
	process()
	time.Sleep(time.Second * 1)
}
func process() {
	c := make(chan string, 2)

	go hoge(c)
	go func() {
		msg := <-c
		fmt.Println(msg)
	}()
}
func hoge(ch chan<- string) {
	ch <- "move"
	fmt.Println("channel")
}

このとき、「move」って表示されますかね?ってなお話です。 
仕事でC#触ってる感覚だとまず無理なんですよね。
チャンネルの概念からすると保持してくれてもいいかもしれないが、、、、

はい、出来ました。優秀ですね。
最初goのsleepってnsなのを忘れてて、なるほど出来ないね、、などと思ったのはまた別の話。

本記事の意図として、gocronで一発実行後に、自身のJobを消したかったのです。
これでまた一歩進んだわけです。

Discussion