Я почти никогда не пишу в этот блог о программировании, поэтому есть повод написать. Берем сортировку методом пауз, язык программирования Go и смотрим, как там можно применить встроенную в язык параллельность, каналы и горутины.
package main
import(
"fmt"
"time"
)
var get_value chan int
func send_value(x int) {
time.Sleep(int64(x) * 1E8)
get_value <- x
}
func main() {
values := []int{3, 1, 9, 7, 2, 6, 4, 8, 5, 10}
get_value = make(chan int)
for _, x := range values {
go send_value(x)
}
for range values {
fmt.Println(<- get_value)
}
}
Самое большое умиление (изумление?) — отказ компилятора самостоятельно расширять типы, например, попытка умножения int на int64 приводит к ошибке компиляции.
Конструкция с переменной _ и оператором range — типовой подход для обхода массивов без счетчиков.
Очень приятный (хоть и по-паскалевски выглядящий) оператор :=, который позволяет немного экономить на объявлении типа переменной.
Ну а за реализацию конкурентных вычислений — респект и уважуха.