Übungsaufgaben
Zehn interaktive Übungen zu Ownership in Rust und zu Go — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung.
Welche Aussagen über Rust und Go stimmen?
Ordne jede Karte der passenden Sprache zu.
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.Fünf Behauptungen zu Ownership in Rust und Goroutinen in Go.
String; einfache Zahlen werden kopiert.Welche Zahl gibt dieses Go-Programm aus?
package main
import "fmt"
func main() {
summe := 0
for i := 2; i < 20; i += 3 {
if i%2 == 0 {
summe += i
}
}
fmt.Println(summe)
}:= statt int.Tim schreibt sein erstes Go-Programm. Der Compiler lehnt es ab. Finde die drei Zeilen, die einen Compilerfehler auslösen.
:= heißt „anlegen und zuweisen“, = heißt „ändern“. Wer die beiden verwechselt, bekommt in Go sofort einen Compilerfehler — genau wie bei ungenutzten Variablen.Bringe die Ereignisse beim Ausführen dieses Rust-Programms in die zeitlich richtige Reihenfolge.
fn zeige(s: &String) {
println!("{}", s);
}
fn main() {
let liste = String::from("Brot, Milch");
zeige(&liste);
let neu = liste;
println!("{}", neu);
}zeige fertig ist.
neu wird ausgegeben.
liste wird Besitzer des Strings „Brot, Milch“.
main wird neu ungültig, der Speicher wird sofort freigegeben.
neu, liste ist ab jetzt ungültig.
zeige leiht den String mit & aus; Besitzer bleibt liste.
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.Du kennst C, Java und Python aus früheren Kapiteln. Verbinde jede Sprache mit der Art, wie sie Speicher verwaltet und ausgeführt wird.
Verfolge die Werte in diesem Rust-Programm.
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);
}-
Wert von
b -
Wert von
anach dem Aufrufverdopple(a) -
Wert von
c -
Wert von
d
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.Gegeben sind die Funktionen fn nimm(s: String) und fn zeige(s: &String). Welche main-Rümpfe kompilieren fehlerfrei?
let b = a; oder nach nimm(a) gehört der String nicht mehr a. Mit & geliehen bleibt a Besitzer, und Zahlen werden sowieso kopiert.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?
