Menu

Go Hello World: dein erstes Golang-Programm erklärt

Das Go-Hello-World-Programm Zeile für Zeile: package main, der Import-Block, func main und fmt.Println, dazu wie du es ausführst und welche Compilerfehler Einsteiger zuerst sehen.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Hier ist das komplette Programm. Klick auf Run.

Keine dieser Zeilen ist optional. Der Rest dieser Seite erklärt, was jede einzelne tut.

Zeile für Zeile

package main

Jede Go-Datei beginnt mit einer package-Klausel, die das Paket nennt, zu dem sie gehört. Der Name main ist besonders: Er kennzeichnet das Paket als ausführbares Programm. Jeder andere Name (package utils, package hello) ergibt eine Bibliothek, die anderer Code importiert, die aber nicht allein laufen kann.

import "fmt"

import holt ein anderes Paket herein, damit du es nutzen kannst. fmt ist das Formatierungs- und Ausgabepaket der Standardbibliothek. Nach dem Import erreichst du seine exportierten Namen über den Paketnamen: fmt.Println, fmt.Printf, fmt.Sprintf.

Um mehrere Pakete zu importieren, nimm einen geklammerten Block mit einem Pfad pro Zeile:

import (
	"fmt"
	"strings"
)

Go weigert sich, eine Datei zu kompilieren, die ein Paket importiert, das sie nicht benutzt. Das hält die Abhängigkeitslisten ehrlich, und es ist der erste Fehler, auf den die meisten stoßen.

func main()

func deklariert eine Funktion. main im Paket main ist der Einstiegspunkt: Das Programm startet, wenn main startet, und endet, wenn main zurückkehrt. Sie nimmt keine Argumente und gibt nichts zurück. Kommandozeilenargumente kommen aus os.Args, Exit-Codes aus os.Exit.

fmt.Println("Hello, World!")

Println gibt seine Argumente aus, setzt ein Leerzeichen dazwischen und hängt einen Zeilenumbruch an. Der Name beginnt mit einem Großbuchstaben, weil nur großgeschriebene Namen aus einem Paket exportiert werden. fmt.println mit kleinem p ist ein Compilerfehler.

Mehr als einen String ausgeben

Println nimmt beliebig viele Werte beliebigen Typs. Mit Printf bestimmst du das Format selbst:

%s wird durch einen String ersetzt und %d durch eine Ganzzahl. Printf und Print fügen keinen Zeilenumbruch an, also schreibst du \n selbst. Die vollständige Tabelle der Verben steht auf der Seite zu fmt.Printf.

Auf deinem Rechner ausführen

Wenn Go installiert ist, speichere das Programm als main.go in einem leeren Ordner und führ es aus:

go run main.go
Hello, World!

go run kompiliert die Datei in ein temporäres Binary und führt es aus. Für ein Binary, das du behalten und woandershin kopieren kannst, nimm go build:

go mod init example.com/hello
go build
./hello
Hello, World!

go build braucht ein Modul (eine go.mod-Datei), das go mod init anlegt. Das Binary heißt wie der letzte Teil des Modulpfads, hier hello (hello.exe unter Windows). Den Unterschied zwischen run, build und install erklärt die Seite go run und go build.

Wo die Semikolons geblieben sind

Die Grammatik von Go verwendet Semikolons, aber du tippst sie fast nie. Der Compiler fügt am Ende jeder Zeile eins ein, deren letztes Token eine Anweisung beenden könnte: ein Bezeichner, ein Literal, ), } und ein paar Schlüsselwörter wie return. Diese Regel ist der Grund, warum dieser verbreitete Stil aus anderen Sprachen scheitert:

func main()
{
	fmt.Println("Hello, World!")
}
./main.go:6:1: syntax error: unexpected semicolon or newline before {

Nach func main() wurde ein Semikolon eingefügt, also ist die { in der nächsten Zeile ein Fehler. Die öffnende Klammer steht immer in derselben Zeile. Die gleiche Regel gilt für if, for, switch und jeden anderen Block.

Die ersten Fehler, erklärt

Das sind die Meldungen, die Einsteiger in ihrer ersten Stunde sehen, genau so, wie Go 1.24 sie ausgibt.

Ein ungenutzter Import oder eine ungenutzte Variable.

package main

import (
	"fmt"
	"os"
)

func main() {
	x := 5
	fmt.Println("hi")
}
./main.go:5:2: "os" imported and not used
./main.go:9:2: declared and not used: x

Beides sind Compilerfehler, keine Warnungen. Lösch den Import oder die Variable. Wenn du eine Variable beim Debuggen behalten musst, weise sie dem Blank Identifier zu: _ = x.

Kleingeschriebener Funktionsname.

./main.go:6:6: undefined: fmt.println

Nicht exportierte Namen sind außerhalb ihres Pakets unsichtbar. Nimm fmt.Println.

Der falsche Paketname.

package example.com/hello is not a main package

In der Datei steht package hello (oder irgendetwas anderes als main), und du hast versucht, sie auszuführen. Ändere es zu package main.

Fehlendes Modul.

go: go.mod file not found in current directory or any parent directory; see 'go help modules'

go build und go run . arbeiten mit Modulen. Führ einmal go mod init example.com/hello im Ordner aus. go run main.go, das eine Datei nennt, funktioniert auch ohne.

Formatierung

Go hat einen offiziellen Code-Stil, und gofmt setzt ihn um. Lass es über jede Datei laufen, die du schreibst:

go fmt ./...

Es rückt mit Tabs ein, richtet Kommentare und Struct-Felder aus und vereinheitlicht Abstände. Editoren mit Go-Unterstützung führen es beim Speichern aus. Go-Code sieht überall gleich aus, also gibt es nichts zu konfigurieren und nichts im Code-Review zu diskutieren.

Häufig gestellte Fragen

Wie schreibt man Hello World in Go?

Speichere das als main.go:

package main

import "fmt"

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

Führ dann go run main.go aus. Es gibt Hello, World! aus.

Warum braucht ein Go-Programm package main?

package main sagt dem Compiler, dass dieses Paket ein ausführbares Programm ist und keine Bibliothek. Das Programm startet in der Funktion main des Pakets main. Jeder andere Paketname erzeugt eine Bibliothek, und go run lehnt sie mit „is not a main package“ ab.

Warum steht die öffnende geschweifte Klammer in Go in derselben Zeile?

Go fügt am Ende von Zeilen, die eine Anweisung beenden könnten, automatisch Semikolons ein, auch nach func main(). Eine { in der nächsten Zeile würde dann einen separaten Block beginnen, also meldet der Compiler syntax error: unexpected semicolon or newline before {. Die Klammer muss in dieselbe Zeile.

Was bedeutet fmt in Go?

fmt ist das Paket der Standardbibliothek für formatierte Ein- und Ausgabe (der Name ist kurz für „format“). fmt.Println gibt seine Argumente mit Leerzeichen dazwischen und einem Zeilenumbruch am Ende aus; fmt.Printf gibt anhand eines Format-Strings aus.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S