Oto cały program. Kliknij Run.
Żadna z tych linii nie jest opcjonalna. Dalsza część strony wyjaśnia, co robi każda z nich.
Linia po linii
package main
Każdy plik Go zaczyna się od klauzuli package, która podaje nazwę pakietu, do którego plik należy. Nazwa main jest wyjątkowa: oznacza pakiet jako program wykonywalny. Każda inna nazwa (package utils, package hello) tworzy bibliotekę, którą inny kod importuje, ale która sama się nie uruchomi.
import "fmt"
import dołącza inny pakiet, żeby można było z niego korzystać. fmt to pakiet biblioteki standardowej do formatowania i wypisywania. Po zaimportowaniu jego eksportowane nazwy są dostępne przez nazwę pakietu: fmt.Println, fmt.Printf, fmt.Sprintf.
Aby zaimportować kilka pakietów, użyj bloku w nawiasach z jedną ścieżką w każdej linii:
import (
"fmt"
"strings"
)
Go nie skompiluje pliku, który importuje nieużywany pakiet. Dzięki temu listy zależności pozostają uczciwe, a to pierwszy błąd, na który trafia większość osób.
func main()
func deklaruje funkcję. main w pakiecie main to punkt wejścia: program startuje, gdy startuje main, i kończy się, gdy main zwraca. Funkcja nie przyjmuje argumentów i nic nie zwraca. Argumenty wiersza poleceń pochodzą z os.Args, a kody wyjścia z os.Exit.
fmt.Println("Hello, World!")
Println wypisuje swoje argumenty, wstawia między nimi spację i dodaje znak nowej linii. Nazwa zaczyna się wielką literą, bo z pakietu eksportowane są tylko nazwy zaczynające się wielką literą. fmt.println z małym p to błąd kompilacji.
Wypisywanie czegoś więcej niż string
Println przyjmuje dowolną liczbę wartości dowolnego typu. Printf daje kontrolę nad formatem:
%s zostaje zastąpione stringiem, a %d liczbą całkowitą. Printf i Print nie dodają znaku nowej linii, więc \n piszesz sam. Pełna tabela czasowników formatujących jest na stronie o fmt.Printf.
Uruchom program na swoim komputerze
Po zainstalowaniu Go zapisz program jako main.go w pustym folderze i uruchom go:
go run main.go
Hello, World!
go run kompiluje plik do tymczasowej binarki i ją uruchamia. Aby dostać binarkę, którą można zachować i skopiować gdzie indziej, użyj go build:
go mod init example.com/hello
go build
./hello
Hello, World!
go build potrzebuje modułu (pliku go.mod), który tworzy go mod init. Binarka nazywa się tak jak ostatni człon ścieżki modułu, tutaj hello (hello.exe w Windows). Różnice między run, build i install opisuje strona o go run i go build.
Gdzie się podziały średniki
Gramatyka Go używa średników, ale prawie nigdy ich nie wpisujesz. Kompilator wstawia średnik na końcu każdej linii, której ostatni token może kończyć instrukcję: identyfikatora, literału, ), } i kilku słów kluczowych, takich jak return. Z powodu tej reguły nie działa popularny styl z innych języków:
func main()
{
fmt.Println("Hello, World!")
}
./main.go:6:1: syntax error: unexpected semicolon or newline before {
Po func main() wstawiono średnik, więc { w następnej linii jest błędem. Nawias otwierający zawsze stoi w tej samej linii. Ta sama reguła dotyczy if, for, switch i każdego innego bloku.
Pierwsze błędy, wyjaśnione
To komunikaty, które początkujący widzą w pierwszej godzinie, dokładnie tak, jak wypisuje je Go 1.24.
Nieużywany import lub zmienna.
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
Oba to błędy kompilacji, a nie ostrzeżenia. Usuń import albo zmienną. Jeśli podczas debugowania musisz zachować zmienną, przypisz ją do pustego identyfikatora: _ = x.
Nazwa funkcji małą literą.
./main.go:6:6: undefined: fmt.println
Nazwy nieeksportowane są niewidoczne poza swoim pakietem. Użyj fmt.Println.
Zła nazwa pakietu.
package example.com/hello is not a main package
Plik zawiera package hello (albo cokolwiek innego niż main), a próbujesz go uruchomić. Zmień to na package main.
Brak modułu.
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
go build i go run . działają na modułach. Uruchom raz w folderze go mod init example.com/hello. go run main.go, które wskazuje konkretny plik, działa bez modułu.
Formatowanie
Go ma jeden oficjalny styl kodu, a gofmt go stosuje. Uruchamiaj go na każdym pliku, który piszesz:
go fmt ./...
Używa tabulatorów do wcięć, wyrównuje komentarze i pola struktur oraz ujednolica odstępy. Edytory z obsługą Go uruchamiają go przy zapisie. Kod w Go wszędzie wygląda tak samo, więc nie ma czego konfigurować ani o czym dyskutować w code review.
Najczęściej zadawane pytania
Jak napisać hello world w Go?
Zapisz to jako main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Potem uruchom go run main.go. Program wypisze Hello, World!.
Dlaczego program w Go potrzebuje package main?
package main mówi kompilatorowi, że ten pakiet jest programem wykonywalnym, a nie biblioteką. Program zaczyna się od funkcji main w pakiecie main. Każda inna nazwa pakietu daje bibliotekę, a go run ją odrzuca z komunikatem "is not a main package".
Dlaczego w Go nawias klamrowy otwierający musi być w tej samej linii?
Go automatycznie wstawia średniki na końcu linii, które mogą kończyć instrukcję, także po func main(). { w następnej linii zaczynałby wtedy osobny blok, więc kompilator zgłasza syntax error: unexpected semicolon or newline before {. Nawias musi być w tej samej linii.
Co oznacza fmt w Go?
fmt to pakiet biblioteki standardowej do formatowanego wejścia i wyjścia (nazwa to skrót od "format"). fmt.Println wypisuje argumenty ze spacjami między nimi i znakiem nowej linii na końcu; fmt.Printf wypisuje według łańcucha formatującego.