Об успехах BSD в бизнесе
2025-11-07 10:13Стефано Маринелли делится 20-летним опытом внедрения и сопровождения юниксных систем и сервисов.

type Handshake[Treq any, Tack any] struct {
Req chan Treq
Ack chan Tack
}
По каналу запроса передаются значения в одну сторону, по каналу ответа - в обратную. Если нужен только сигнал, без всякого значения - передаём struct{} (аналог void). Вот пример реализации сложения двух чисел:
func AsyncAdder(a, b, sum *Handshake[int, struct{}]) {
for {
// Wait for inputs to arrive
var x, y int
haveA, haveB := false, false
for !(haveA && haveB) {
select {
case x = <-a.Req:
haveA = true
case y = <-b.Req:
haveB = true
}
}
// Compute sum
s := x + y
// Send result downstream (Req↑)
sum.Req <- s
// Wait for output Ack↑
<-sum.Ack
// Only now acknowledge inputs (completing 4-phase handshake)
a.Ack <- struct{}{}
b.Ack <- struct{}{}
}
}Полный текст здесь: add.go