Многопоточность в Go
Многопоточность
Многопоточность - это одновременное выполнение более чем одной задачи
Для реализации многопоточности в Go есть такие инструменты, как горутины и каналы
Горутины
Горутина — это функция, которая может работать параллельно с другими функциями
Для создания горутины используется ключевое слово go, за которым следует вызов функции
							 func f(n int) { 
							 for i := 0; i < 10; i++ { 
							 fmt.Println(n, ":", i) 
							 } 
							 } 
							 func main() { 
							 go f(0) 
							 var input string 
							 fmt.Scanln(&input) 
							 } 
						
Каналы
Каналы обеспечивают возможность общения нескольких горутин друг с другом, чтобы синхронизировать их выполнение
							 func main() { 
							 messages := make(chan string) 
							 go func() { messages <- "ping" }() 
							 msg := <-messages 
							 fmt.Println(msg) 
							 } 
						
Направление каналов
Мы можем задать направление передачи сообщений в канале,
сделав его только отправляющим или принимающим.
							 func pinger(c chan<- string) 
						
Канал c будет только отправлять сообщение.
Попытка получить сообщение из канала c вызовет ошибку компилирования.
							 func pinger(c <-chan string) 
						
Буферизированный канал
Буферизированный канал принимает ограниченное количество значений
							 func main() { 
							 messages := make(chan string, 2) 
							 messages <- "buffered" 
							 messages <- "channel" 
							 fmt.Println(<-messages) 
							 fmt.Println(<-messages) 
							 } 
						
Оператор select
Оператор select работает как switch, но для каналов
							 func main() { 
							 c1 := make(chan string) 
							 c2 := make(chan string) 
							 go func() { time.Sleep(time.Second * 1) c1 <- "one" }() 
							 go func() { time.Sleep(time.Second * 2) c2 <- "two" }() 
							 for i := 0; i < 2; i++ { 
							 select { 
							 case msg1 := <-c1: 
							 fmt.Println("received", msg1) 
							 case msg2 := <-c2: 
							 fmt.Println("received", msg2) 
							 } 
							 } 
							 } 
						

Презентация и исходный код

github.com/lowl-io/screencast