Skip to content

Modul 1: Getting Started — go mod init & das erste Programm

Go-Grundlagen: Was ist Go, Projektaufbau mit go mod, das erste Programm, Tooling (gofmt, go vet, go test) und die Standardbibliothek.

Fortschritt0/5 Lektionen
1

Was ist Go? Eine Sprache für echte Systeme

Lektion 1 von 5

Warum Go existiert

Go (oft „Golang" genannt) wurde ab 2007 bei Google von Robert Griesemer, Rob Pike und Ken Thompson entwickelt — als Antwort auf die Probleme großer C++-Codebasen: lange Builds, komplexe Nebenläufigkeit, umständliche Tooling-Ketten.

Das Ergebnis ist eine einfache Sprache für komplexe Systeme:

  • Schnelle Builds — ein Projekt mit tausenden Dateien kompiliert in Sekunden.
  • Eingebaute Concurrency — go func() { ... }() startet eine Goroutine; Kommunikation über Channels, kein Shared-State-Threading.
  • Ein Tooling-Kit — gofmt erzwingt ein Format, go test ist Teil der Sprache, go vet fängt echte Fehler, go mod verwaltet Abhängigkeiten.
  • Statisch typisiert und kompiliert — ein einzelnes Binary, läuft überall ohne Laufzeitumgebung.
// Das berühmteste kurze Go-Programm — zeigt die Essenz:
// ein main-Paket, eine main-Funktion, kein Semikolon-Zwang, keine Klassen.
package main

import "fmt"

func main() {
	fmt.Println("Hello, Go!")
}

Pakete sind die Einheit

In Go ist alles ein Paket. Jede Datei startet mit package <name>. Das Programm beginnt im Paket main mit der Funktion func main(). Code in anderen Paketen (wie fmt) wird mit import hereingeholt — Importe, die du nicht nutzt, sind ein Fehler beim Kompilieren.

Wo Go zuhause ist

  • Infrastruktur-Tools: Kubernetes, Docker, Terraform, Hugo, Caddy
  • CLI-Tools: jeder moderne CLI ist oft in Go gebaut (schnell, ein Binary)
  • Netzwerkdienste: HTTP-Server, Proxys, Load Balancer
  • DevOps & SRE: Monitoring-Agenten, Konfigurationsgeneratoren

✅ Wichtige Erkenntnisse

Haken setzen, um deinen Lernfortschritt zu markieren:

    2

    Dein erstes Programm: go mod init, go run, go build

    Lektion 2 von 5

    Die drei Befehle, die du am Anfang brauchst

    go mod init <modul> legt ein neues Go-Modul an (erzeugt go.mod). go run . kompiliert und führt dein Programm aus. go build erzeugt das Binary.

    # Projekt anlegen
    mkdir hello && cd hello
    go mod init hello
    
    # hello.go schreiben, dann ausführen
    go run .
    # Hallo, Go!
    
    # und ein Binary bauen (heißt hello auf Linux/Mac, hello.exe auf Windows)
    go build -o hello
    
    // hello.go
    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("Hallo, Go!")
    }
    

    go.mod — das Modul-Manifest

    go.mod ist die eine Datei, die jedes Go-Projekt definiert. Sie heißt das Modul (z. B. hello oder dein echter Domain-Pfad wie github.com/name/projekt) und listet Go-Version und Abhängigkeiten.

    module hello
    
    go 1.24
    

    Ein Wort zu den Semikolons

    Go braucht keine Semikolons, aber der Compiler fügt sie automatisch am Zeilenende ein. Deshalb sind diese zwei Programmierfehler klassisch, die NICHT funktionieren:

    // So NICHT — das öffnende { gehört ans Gleichheitszeichen.
    func main()
    {
    }
    
    // So ja — Sieht kurz aus, ist aber die ganze Regel:
    func main() {
    }
    

    ✅ Wichtige Erkenntnisse

    Haken setzen, um deinen Lernfortschritt zu markieren:

      3

      Tooling, das mitkommt: gofmt, go vet, go test

      Lektion 3 von 5

      Dein Werkzeugkoffer

      Go liefert die Qualitäts-Tools als Teil der Sprache — nichts extra installieren:

      BefehlWas es tut
      gofmt -w file.goFormatiert deinen Code auf den offiziellen Standard
      go vet ./...Findet verdächtige Konstrukte (nicht nur Syntax)
      go test ./...Führt Tests aus — Testen ist eingebaut
      go doc <paket>Zeigt die Doku eines Pakets im Terminal
      go run .Führt das aktuelle Paket aus
      go build ./...Kompiliert alles ohne auszuführen

      gofmt beendet alle Flames

      In Go gibt es eine offizielle Formatierung, erzwingbar mit gofmt (bzw. go fmt ./... im Projekt). Ob Tabs oder Spaces, ob { auf eine neue Zeile — nur diese eine Antwort ist richtig. So liest jedes Struktur-Team jede Datei gleich.

      go vet fängt echte Fehler

      package main
      
      import "fmt"
      
      func main() {
      	weight := 12
      	height := 1.70
      
      	// vet warnt: mismatched types int und float64 — das ist NICHT gemeint!
      	index := weight / height
      
      	fmt.Println(index)
      }
      

      go vet meldet hier die Typen-Mischung. Richtige Version: beide Werte explizit in float64 umwandeln — mehr dazu in Modul 2.

      ✅ Wichtige Erkenntnisse

      Haken setzen, um deinen Lernfortschritt zu markieren:

        4

        Die Standardbibliothek — deine Superkraft

        Lektion 4 von 5

        fmt, strings, os, sort

        Die Go-Standardbibliothek ist groß und durchdacht — die meisten Aufgaben löst du, ohne je ein Paket aus dem Netz zu installieren.

        package main
        
        import (
        	"fmt"
        	"os"
        	"sort"
        	"strings"
        )
        
        func main() {
        	// fmt.Sprintf: Text zusammensetzen
        	msg := fmt.Sprintf("Nutzer: %s, Versuche: %d", "ana", 3)
        
        	// strings: alles rund um Text
        	upper := strings.ToUpper("hello")
        	parts := strings.Split("a,b,c", ",") // ["a" "b" "c"]
        
        	// sort: in-place sortieren
        	nums := []int{3, 1, 2}
        	sort.Ints(nums) // [1 2 3]
        
        	// os: Argumente und Umgebung
        	args := os.Args[1:]
        
        	fmt.Println(msg, upper, parts, nums, args)
        }
        

        Es gibt KEINE Klassen, aber Methoden

        Bei Strings, Slices, Maps — alles sind Werte mit Methoden. strings. ToUpper ist eine Funktion der Bibliothek, nicht eine Methode an der Klasse String. Trotzdem kann man eigene Typen mit Methoden versehen (Modul 2, Lektion 10).

        Doku im Terminal: go doc

        # Die Signatur einer Funktion ansehen
        go doc strings.Split
        # Die ganze Dokumentation zum Paket
        go doc strings | head -20
        

        ✅ Wichtige Erkenntnisse

        Haken setzen, um deinen Lernfortschritt zu markieren:

          5

          Tests schreiben: go test ist Teil der Sprache

          Lektion 5 von 5

          Testen ist kein Extra-Ding

          In Go schreibst du Tests mit dem eingebauten testing-Paket. Eine Datei file_test.go neben dem Code, eine Funktion TestXxx(t *testing.T), und go test läuft — ohne Framework, ohne Mocking-Bibliothek, ohne Konfiguration.

          // add.go
          package main
          
          func add(a, b int) int {
          	return a + b
          }
          
          // add_test.go
          package main
          
          import "testing"
          
          func TestAdd(t *testing.T) {
          	if got := add(2, 3); got != 5 {
          		t.Errorf("add(2, 3) = %d, erwartet 5", got)
          	}
          }
          
          go test ./...
          # ok  	hello	0.002s
          

          Table-Driven Tests — das Go-Muster

          Statt viele Testfunktionen zu schreiben, nutzt Go das Table-Driven-Muster: eine Tabelle aus Eingaben und erwarteten Ausgaben, eine Schleife, ein Test.

          func TestAddTable(t *testing.T) {
          	cases := []struct {
          		a, b, want int
          	}{
          		{2, 3, 5},
          		{0, 0, 0},
          		{-1, 1, 0},
          	}
          	for _, c := range cases {
          		if got := add(c.a, c.b); got != c.want {
          			t.Errorf("add(%d, %d) = %d, want %d", c.a, c.b, got, c.want)
          		}
          	}
          }
          

          Wochen-Check Modul 1

          Nimm dir 3 Minuten: Beantworte die vier Fragen aus diesem Modul ohne Hilfe. Richtig beantwortet? Weiter zu Modul 2.

          ✅ Wichtige Erkenntnisse

          Haken setzen, um deinen Lernfortschritt zu markieren:

            This site uses essential cookies for Stripe payments. No tracking cookies.