Go ist die Sprache Nummer 1 für cloudnative Entwicklung. Der Beweis: 19 von 25 Projekten der Cloud Native Computing Foundation im höchsten Reifegrad nutzen Go, darunter Kubernetes und Docker. Aber was macht Go interessant für Java oder .NET-Entwickler? Go ist durch und durch auf Nebenläufigkeit und Parallelisierung ausgelegt. Außerdem hat Go ein statisches Typsystem, eine moderne, mächtige Standardbibliothek und ist rasend schnell. Aber vor allem: Go macht Spaß. Mit einfachen praktischen Beispielen lernt ihr mit Go produktiv zu entwickeln. Wir beginnen mit dem Hello World. Dann ein kleines Kommandozeilen Tool und eine einfache Webanwendung. Dazu nutzen wir überwiegend die Standardbibliothek von Go. Ihr lernt wesentliche Konzepte von Go wie Interfaces, Goroutinen und Channels kennen. Zur Entwicklung nutzen wir die Go-Tools und eine moderne Entwicklungsumgebung. Nach unserem Workshop könnt ihr erste eigene Go-Anwendungen entwickeln. Und ihr seid bereit die nächsten Schritte mit Go zu gehen. Go ist eine Sprache für Macher. Also lasst uns machen!
9. CLI Projekt aufsetzen
// 1. Go Modul erstellen (erzeugt go.mod)
> go mod init crossnative.com/pro
// 2. Datei main.go erstellen
package main
import "fmt"
func main() {
fmt.Println("Hello Go Pro!")
}
Ausführen
go build . // 1. Code kompilieren
./pro // 2. Binary ausführen
go run . // Code kompilieren und ausführen
13. Proverbs Modul nutzen
// 1. Proverbs Modul Dependency
> go get github.com/jboursiquot/go-proverbs
// 2. Go Modul Descriptor go.mod
module crossnative.com/pro
go 1.22
require github.com/jboursiquot/go-proverbs v0.0.2
24. File Downloader2/3
// 1. Channel für Download Jobs
jobs := make(chan int, len(urls))
func downloadURLs(ctx context.Context, urls []string) {
1
2
3
4
// 2. Go Routinen für Downloads starten
5
for _, url := range urls {
6
go func() {
7
downloadURL(ctx, url)
8
jobs <- 1 // Send an Channel (blockiert)
9
}()
10
}
11
12
// 3. Warten auf Ende aller Go Routinen
13
for range len(urls) {
14
<-jobs // Receive von Channel (blockiert)
15
}
16
}
17
// 2. Go Routinen für Downloads starten
for _, url := range urls {
go func() {
downloadURL(ctx, url)
jobs <- 1 // Send an Channel (blockiert)
}()
}
func downloadURLs(ctx context.Context, urls []string) {
1
// 1. Channel für Download Jobs
2
jobs := make(chan int, len(urls))
3
4
5
6
7
8
9
10
11
12
// 3. Warten auf Ende aller Go Routinen
13
for range len(urls) {
14
<-jobs // Receive von Channel (blockiert)
15
}
16
}
17
// 3. Warten auf Ende aller Go Routinen
for range len(urls) {
<-jobs // Receive von Channel (blockiert)
}
func downloadURLs(ctx context.Context, urls []string) {
1
// 1. Channel für Download Jobs
2
jobs := make(chan int, len(urls))
3
4
// 2. Go Routinen für Downloads starten
5
for _, url := range urls {
6
go func() {
7
downloadURL(ctx, url)
8
jobs <- 1 // Send an Channel (blockiert)
9
}()
10
}
11
12
13
14
15
16
}
17
func downloadURLs(ctx context.Context, urls []string) {
// 1. Channel für Download Jobs
jobs := make(chan int, len(urls))
// 2. Go Routinen für Downloads starten
for _, url := range urls {
go func() {
downloadURL(ctx, url)
jobs <- 1 // Send an Channel (blockiert)
}()
}
// 3. Warten auf Ende aller Go Routinen
for range len(urls) {
<-jobs // Receive von Channel (blockiert)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
32. Set up Cats App
# 1. Verzeichnis erstellen
mkdir cats
cd cats
# 2. Go Modul aufsetzen
go mod init crossnative.com/cats
# 3. Go Datei erstellen
touch main.go
37. Test ausführen
go test -v ./...
1
=== RUN TestCatAPIHandler
2
--- PASS: TestCatAPIHandler (0.00s)
3
PASS
4
coverage: 50.0% of statements
5
ok crossnative.com/cats 0.127s coverage: 50.0% of statements
6
=== RUN TestCatAPIHandler
--- PASS: TestCatAPIHandler (0.00s)
PASS
coverage: 50.0% of statements
ok crossnative.com/cats 0.127s coverage: 50.0% of statements
go test -v ./...
1
2
3
4
5
6