MINT lernen

Rust und Go: sicher, schnell

Zehn interaktive Übungen zu Ownership in Rust und zu Go — von AFB I bis AFB III.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn interaktive Übungen zu Ownership in Rust und zu Go — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung.

A1
Steckbrief Rust und Go
AFB I

Welche Aussagen über Rust und Go stimmen?

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Go hat einen Garbage Collector, Rust nicht — Rust regelt Speicher über Ownership. Der Borrow Checker arbeitet beim Kompilieren, und eine ungenutzte Variable ist in Go ein echter Compilerfehler, keine Warnung.
A2
Rust, Go oder beide?
AFB I

Ordne jede Karte der passenden Sprache zu.

Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1nur Rust
2nur Go
3beide
Erkennungszeichen: Rust nutzt let, fn und Makros mit Ausrufezeichen wie println!; Go nutzt :=, func, das Paket fmt und das Schlüsselwort go für Goroutinen. Kompiliert und statisch typisiert sind beide.
A3
Stimmt's? — Besitz und Nebenläufigkeit
AFB I

Fünf Behauptungen zu Ownership in Rust und Goroutinen in Go.

Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Verschoben (move) werden in Rust nur Werte wie String; einfache Zahlen werden kopiert.
A4
Was gibt Go aus?
AFB II

Welche Zahl gibt dieses Go-Programm aus?

Go
package main

import "fmt"

func main() {
	summe := 0
	for i := 2; i < 20; i += 3 {
		if i%2 == 0 {
			summe += i
		}
	}
	fmt.Println(summe)
}
Rechne selbst und trage das Ergebnis ein — Enter prüft direkt.
i läuft 2, 5, 8, 11, 14, 17 (20 ist nicht mehr kleiner als 20). Gerade davon sind 2, 8 und 14 — Summe 24. Die Schleife ist wie in Java aufgebaut, nur ohne Klammern um den Kopf und mit := statt int.
A5
Fehlersuche: Der Go-Compiler meckert
AFB II

Tim schreibt sein erstes Go-Programm. Der Compiler lehnt es ab. Finde die drei Zeilen, die einen Compilerfehler auslösen.

Klicke genau die fehlerhaften Zeilen an — die richtigen musst du stehen lassen.
:= heißt „anlegen und zuweisen“, = heißt „ändern“. Wer die beiden verwechselt, bekommt in Go sofort einen Compilerfehler — genau wie bei ungenutzten Variablen.
A6
Die Einkaufsliste wandert
AFB II

Bringe die Ereignisse beim Ausführen dieses Rust-Programms in die zeitlich richtige Reihenfolge.

Rust
fn zeige(s: &String) {
    println!("{}", s);
}

fn main() {
    let liste = String::from("Brot, Milch");
    zeige(&liste);
    let neu = liste;
    println!("{}", neu);
}
Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1Die Ausleihe endet, als zeige fertig ist.
2neu wird ausgegeben.
3liste wird Besitzer des Strings „Brot, Milch“.
4Am Ende von main wird neu ungültig, der Speicher wird sofort freigegeben.
5Der Besitz wandert zu neu, liste ist ab jetzt ungültig.
6zeige leiht den String mit & aus; Besitzer bleibt liste.
Erst leihen, dann verschieben — deshalb kompiliert das Programm. Stünde zeige(&liste) hinter let neu = liste;, würde der Borrow Checker es ablehnen. Freigegeben wird ohne Garbage Collector genau dann, wenn der letzte Besitzer ungültig wird.
A7
Mix: Wer räumt den Speicher auf?
AFB II

Du kennst C, Java und Python aus früheren Kapiteln. Verbinde jede Sprache mit der Art, wie sie Speicher verwaltet und ausgeführt wird.

A8
Rechenkette: Kopie oder Besitz?
AFB III

Verfolge die Werte in diesem Rust-Programm.

Rust
fn verdopple(mut z: i32) -> i32 {
    z = z * 2;
    z
}

fn main() {
    let a = 5;
    let b = verdopple(a);
    let c = a + b;
    let d = verdopple(c) - a;
    println!("{} {} {} {}", a, b, c, d);
}
Rechne die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Wert von b
  2. Wert von a nach dem Aufruf verdopple(a)
  3. Wert von c
  4. Wert von d
Trick: a bleibt 5! Ein i32 wird beim Aufruf kopiert — verdopple ändert nur seine eigene Kopie z, und a bleibt gültig. Die letzte Zeile ohne Semikolon (z) ist der Rückgabewert. Also b = 10, c = 5 + 10 = 15, d = 30 − 5 = 25.
A9
Was lässt der Borrow Checker durch?
AFB III

Gegeben sind die Funktionen fn nimm(s: String) und fn zeige(s: &String). Welche main-Rümpfe kompilieren fehlerfrei?

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Abgelehnt wird nur, wer einen verschobenen String weiterbenutzt: nach let b = a; oder nach nimm(a) gehört der String nicht mehr a. Mit & geliehen bleibt a Besitzer, und Zahlen werden sowieso kopiert.
A10
Goroutinen im Schulserver
AFB III

Ein Go-Server soll 1200 Anfragen zur Notenübersicht beantworten. Jede Anfrage dauert 50 ms. Nacheinander bearbeitet dauert das 60 s. Mit Goroutinen laufen die Anfragen auf 8 Prozessorkernen gleichzeitig; nimm an, dass sich die Arbeit perfekt gleichmäßig verteilt. Wie lange dauert es dann?

Schiebe den Regler auf deine Antwort — Pfeiltasten bewegen ihn feiner. Nach dem Prüfen siehst du den Trefferbereich.
0 s60 s
1200 Anfragen : 8 Kerne = 150 Anfragen pro Kern; 150 · 0,05 s = 7,5 s (oder 60 s : 8). In der Praxis ist es etwas langsamer, weil die Verteilung Zeit kostet — Goroutinen sind aber so leicht, dass Go-Server Tausende davon gleichzeitig verwalten können.