Sobes.tech

Golang

Aufgabe: «Ping-Pong mit Timeout» Schreiben Sie eine Funktion pingPong, die: - Zwei Goroutines startet: eine generiert Nachrichten "ping", die andere — "pong". - Die Goroutines sollen Nachrichten strikt abwechselnd über einen gemeinsamen Kanal austauschen. - Der Austausch dauert 3 Sekunden, danach soll das Programm beendet werden (sauberes Herunterfahren). - Verwenden Sie einen Kontext zur Abbruchsteuerung mit Timeout. - Geben Sie jede Nachricht zusammen mit der Zeit (in Millisekunden seit Start) aus. Beispiel für die erwartete Ausgabe: 0ms: ping

216

Einfache Live-Coding-Aufgabe (grundlegende Konkurrenz) Bedingung: Schreibe eine Funktion fetchAll(urls []string) map[string]string, die für jede URL eine HTTP GET-Anfrage konkurrierend durchführt und eine Karte zurückgibt, bei der der Schlüssel die URL ist und der Wert der Antwortkörper (String). Wenn die Anfrage fehlschlägt (Fehler, kein 200), ist der Wert ein leerer String. Einschränkungen: - Keine externen Bibliotheken verwenden (nur Standard). - Die Signatur darf nicht geändert werden. - Das Programm darf bei einem Panic in http.Get nicht abstürzen. Beispiel Eingabe: ["[link]" "[link]" "[link]"]

201

Paket main import ( "fmt" ) func a(p *string) { s2 := "string2" *p = s2 } func main() { str1 := "string1" p := &str1 fmt.Println(*p) a(&p) fmt.Println(*p) }

185

Was sagen Sie dem Interviewer (falls gefragt) "Ich würde einen Worker-Pool mit einer festen Anzahl von Workern, einem Kanal für Aufgaben und sync.WaitGroup verwenden. Die Worker führen die Anfragen aus, und Timeout sowie Abbruch werden über den Kontext gesteuert. Die Ergebnisse sammle ich in einem Puffer, der durch ein Mutex (oder einen separaten Kanal) geschützt ist." Jetzt bist du dran Schreibe den Code in diesem Chat. Ich werde ihn überprüfen und Feedback geben. Wenn du nicht weißt, wo du anfangen sollst, bitte um einen Tipp. Viel Erfolg!

177

// alle Elemente des Slices müssen eindeutig sein + insgesamt 1000 Elemente enthalten // das Programm darf aufgrund von time.sleep nicht lange hängen bleiben func main() { checkIncrement := map[int]int32{} var data []int for i := 0; i < 1000; i++ { go func() { data = append(data, i) if _, found := checkIncrement[i]; found { fmt.Println(i) panic("doppelte Inkrement") } checkIncrement[i] = 1 }() } time.Sleep(2 * time.Second) fmt.Println(len(data)) }

159

Was ist ein Zeiger und was passiert, wenn das Argument einer Funktion ein Zeiger ist?

157

Füllen Sie das Slice mit Elementen ohne Mutex, damit es alle 1000 Elemente enthält.

148