Materi
Goroutine adalah fungsi yang berjalan bersamaan dengan bagian program lainnya. Menulis go sebelum pemanggilan fungsi, go kirimEmail(daftar), memulai goroutine baru dan langsung lanjut ke baris berikutnya tanpa menunggu fungsinya selesai. Goroutine jauh lebih ringan daripada thread sistem operasi, sehingga satu program bisa menjalankan ribuan goroutine.
Program berhenti begitu fungsi main selesai, tanpa menunggu goroutine lain. Karena itu goroutine perlu cara memberi tahu bahwa pekerjaannya selesai. Alat utamanya channel: ch := make(chan int) membuat saluran untuk nilai int, ch <- 5 mengirim, dan x := <-ch menerima. Pada channel tanpa buffer, pengirim menunggu sampai ada penerima dan sebaliknya, sehingga setiap kiriman menjadi titik temu dua goroutine.
Bila semua goroutine sedang menunggu dan tidak ada yang bisa melanjutkan, runtime menghentikan program dengan fatal error: all goroutines are asleep - deadlock!. Contoh paling sederhana: main mengirim ke channel tanpa buffer padahal tidak ada goroutine lain yang menerima. Untuk menunggu sekelompok goroutine tanpa mengirim nilai, paket sync menyediakan WaitGroup.
package main
import "fmt"
func kuadrat(n int, hasil chan int) {
hasil <- n * n
}
func main() {
hasil := make(chan int)
go kuadrat(4, hasil)
fmt.Println(<-hasil) // 16: main menunggu sampai nilai terkirim
}