Fan-in / Fan-out в Go: как раздавать задачи и собирать результаты
tasks channel → worker 1 → results channel
→ worker 2 → results channel
→ worker 3 → results channel
→ worker 4 → results channel
→ worker 5 → results channel package main
import "fmt"
type Task struct {
ID int
}
func process(task Task) {
fmt.Println("process task", task.ID)
}
func main() {
tasks := make(chan Task)
for i := 0; i < 5; i++ {
go func(workerID int) {
for task := range tasks {
fmt.Println("worker", workerID)
process(task)
}
}(i)
}
for i := 1; i <= 10; i++ {
tasks <- Task{ID: i}
}
close(tasks)
} workers := runtime.NumCPU() for _, task := range tasks {
go process(task)
} workerCount := 20 var c Cache
c.items["key"] = "value" package main
type Item struct {
Value string
}
type Cache struct {
items map[string]Item
}
func NewCache() *Cache {
return &Cache{
items: make(map[string]Item),
}
} package main
type Counter struct {
count int
}
func (c *Counter) Inc() {
c.count++
} package main
import "fmt"
func main() {
var s []int
fmt.Println(len(s)) // 0
fmt.Println(cap(s)) // 0
s = append(s, 1)
fmt.Println(s) // [1]
} package main
import "fmt"
func main() {
var m map[string]int
fmt.Println(m["key"]) // 0
m["key"] = 1 // panic: assignment to entry in nil map
} m := make(map[string]int)
m["key"] = 1 var ch chan int ch <- 1 // блокировка
<-ch // блокировка ch = make(chan int) var err error
fmt.Println(err == nil) // true var p *MyError = nil
var err error = p
fmt.Println(err == nil) // false var s1 []int
s2 := []int{} var m map[string]int
m["x"] = 10 // panic m := make(map[string]int)
m["x"] = 10 var ch chan int
ch <- 1 // зависание ch := make(chan int)
ch <- 1