Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kenmori/02157f168df82a78917da8b47b5c5f49 to your computer and use it in GitHub Desktop.
Save kenmori/02157f168df82a78917da8b47b5c5f49 to your computer and use it in GitHub Desktop.
【Golang初心者が理解するための】channelチャネル

【Golang初心者の自分が理解する】channel(チャネル)

初心者の自分が最初に「ん??」となったchannelを自分自身理解するために順を追って書いていく

全てのソースコードにはこちらが読み込まれているとする

package main

import (
  "fmt"
)

index

  • 最小のchannel
  • task関数に切り出す
func main() {
	ch := make(chan int) // channelをバッファなしで作成
	go func(){ ch <- 1}() // ゴルーチンで即時に実行 チャネルに送信
	fmt.Println(<-ch) // チャネルが受信
}
func task(c chan int) { // それぞれ task(パラメータ 型 チャネルが送信する型)
	c <- 1
}
func main() {
	ch := make(chan int)
	go task(ch)
	fmt.Println(<-ch)
}
func task(v string, c chan int) { // stringを受け取るようにする
	fmt.Println(v)
	c <- 1

}
func task2(v string, c chan int) {
	fmt.Println(v)
	c <- 2
}
func main() {
	ch := make(chan int)
	ch2 := make(chan int)
	go task2("task2", ch2)
	go task("task", ch)
	fmt.Println(<-ch)
	fmt.Println(<-ch2)
}
package main

import (
	"fmt"
	"sync"
)

func task(v string, wg *sync.WaitGroup) { // 実態型
	fmt.Println(v)
	wg.Done()

}
func task2(v string, wg *sync.WaitGroup) {
	fmt.Println(v)
	wg.Done()
}
func main() {
	var wg sync.WaitGroup // goroutineが終わる前に処理が終わってしまうのを防ぐためにsync.WaitGroup
	wg.Add(2) // 2つの並列処理があることを伝える
	go task("task1", &wg) // ポインタを渡す
	go task2("task2", &wg)
	wg.Wait() // 2つのDoneを待つ
}

参照

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment