Първо предизвикателство

  1. "Уточнение: за улеснение, очакваме изпращането на едно съобщение или регистрирането на нов слушател да се случат чак след като всички регистрирани слушатели са прочели предишното съобщение. С други думи, не търсим ефективност, а коректност."

    Това противоречи с примера, който сте дали, защото c е в друга goroutine и може да прочете съобщението си преди a и b и да се опита да изпрати ново съобщение.

  2. уточнението е с цел да поясним че не очакваме такава имплементация, а очаква ме имплементацията при която дори c да прочете първото съобщение първо(от a, b и c), след като то е било изпратено в същата горутина, и след това изпрати второто съобщение, то това второ съобщение да започне да се изпраща(към a,b и c) едва след като a и b са получили първото.

  3. Примерен тест 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
    }
    
  4. Примерен тест 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)
            }
    }
    

Трябва да сте влезли в системата, за да може да отговаряте на теми.