Golang
Wann werden die Argumente verzögerter Funktionen berechnet – beim Definieren oder beim Aufrufen der Funktion?
Erzähle mir von Goroutinen. Angenommen, wir haben eine Anwendung, in der Goroutinen laufen, und etwas ist schief gelaufen — wie beendet man eine Goroutine zwangsweise?
Können wir Code ohne Schnittstellen schreiben?
Warum werden Trigger hauptsächlich für Legacy-Systeme verwendet?
In welcher Reihenfolge werden die Admission Webhooks ausgeführt und warum gerade so?
Was passiert, wenn der Leser den Kanal schließt, während der Schriftsteller noch schreibt? Wie kann man Panik vermeiden?
Was ist DNS und wie funktioniert es?
Haben Sie schon einmal Kontakt mit den Produkten des Unternehmens gehabt? Arbeitet jemand aus Ihrem Bekanntenkreis dort?
Kann man in Go in einen geschlossenen Kanal schreiben?
Wie kann man verhindern, dass man beim Lesen aus einem leeren Kanal dauerhaft blockiert? Was ist select und welche Muster gibt es?
Warum hast du beschlossen, auf den Markt zu achten? Was suchst du momentan für dich? Worauf achtest du bei der Auswahl eines neuen Unternehmens?
Gibt es Mechanismen, die helfen, Kollisionen in der Programmierung zu vermeiden?
Was ist eine Zeichenkette in Go?
Live-Coding: Semaphore — wie es funktioniert und die Implementierung auf Basis eines gepufferten Kanals.
type Balancer struct { // TODO backends []*BackendImpl index int mu sync.Mutex N int K time.Duration } var _ Backend = &Balancer{} func (b *Balancer) Invoke(ctx context.Context, req Request) (Response, error) { if len(b.backends) == 0 { return nil, fmt.Errorf("Anzahl der backends im slice 0") } b.mu.Lock() index := b.index for b.backends[index].banned { b.index = (b.index + 1) % len(b.backends) index = b.index } b.index = (b.index + 1) % len(b.backends) b.mu.Unlock() backend := b.backends[index] resp, err := backend.Backend.Invoke(ctx, req) if err != nil && backend.countErrors < b.N { backend.mu.Lock() backend.countErrors += 1 if backend.countErrors == b.N { backend.banned = true go func() { time.Sleep(b.K) backend.mu.Lock() defer backend.mu.Unlock() backend.banned = false backend.countErrors = 0 }() } backend.mu.Unlock() } return resp, err } // addrs enthalten die Adressen aller balancierten Instanzen func NewBalancer(addrs []string) *Balancer { // TODO backends := make([]*BackendImplF, len(addrs)) for _, addr := range addrs { implF := BackendImplF{ Backend: NewBackend(addr), } backends = append(backends, &implF) } }
Warum brauchen wir in dieser Aufgabe eine WaitGroup?
Wie viele Zeilen waren in der Datenbank?
Warum brauchst du überhaupt einen Vorgesetzten bei der Arbeit? Wozu?
Welche Sperren erstellt PostgreSQL beim Löschen bestimmter Zeilen?
Was ist eine Schnittstelle in Go? Wie funktioniert Duck Typing? Kann man die Implementierung einer Schnittstelle während der Kompilierung überprüfen?