Ето го, с леко закъснение :)
Всякакви въпроси са добре дошли
Ето го, с леко закъснение :)
Всякакви въпроси са добре дошли
"Уточнение: за улеснение, очакваме изпращането на едно съобщение или регистрирането на нов слушател да се случат чак след като всички регистрирани слушатели са прочели предишното съобщение. С други думи, не търсим ефективност, а коректност."
Това противоречи с примера, който сте дали, защото c е в друга goroutine и може да прочете съобщението си преди a и b и да се опита да изпрати ново съобщение.
уточнението е с цел да поясним че не очакваме такава имплементация, а очаква ме имплементацията при която дори c
да прочете първото съобщение първо(от a, b и c), след като то е било изпратено в същата горутина, и след това изпрати второто съобщение, то това второ съобщение да започне да се изпраща(към a,b и c) едва след като a
и b
са получили първото.
Примерен тест 1:
func ExampleGiven() {
ps := NewPubSub()
a := ps.Subscribe()
b := ps.Subscribe()
c := ps.Subscribe()
go func() {
ps.Publish() <- "wat"
ps.Publish() <- ("wat" + <-c)
}()
fmt.Printf("A recieved %s, B recieved %s and we ignore C!\n", <-a, <-b)
fmt.Printf("A recieved %s, B recieved %s and C received %s\n", <-a, <-b, <-c)
// Output:
//A recieved wat, B recieved wat and we ignore C!
//A recieved watwat, B recieved watwat and C received watwat
}
Примерен тест 2:
func TestPubSubOrder(t *testing.T) {
const M1 string = "SECRET ARMY CODES"
ps := NewPubSub()
r1 := ps.Subscribe()
r2 := ps.Subscribe()
go func() {
ps.Publish() <- M1
}()
if !(<-r1 == M1 && <-r2 == M1) {
t.Errorf("Expected r1 and then r2 to receive the message \"%s\".", M1)
}
const M2 string = "NUCLEAR BOMB ACTIVATION HASH"
go func() {
ps.Publish() <- M2
}()
if !(<-r2 == M2 && <-r1 == M2) {
t.Errorf("Expected r2 and then r1 to receive the message \"%s\".", M2)
}
}
Може ли да качите тестовете за предизвикателството?
Моля да ни извините за забавянето, пак си имахме разни ядове с evans и компания... Променихме леко и качихме тестовете, пуснахме ги отново и маркирахме предизвикателството като проверено (т.е. може да видите execution log-а).
Трябва да сте влезли в системата, за да може да отговаряте на теми.