20 Tiefere Einblicke in die Go-Syntax

Wir werden tiefer in die Syntax von Go eintauchen und einige fortgeschrittene Themen behandeln, die Ihnen helfen werden, Ihren Code präziser und effizienter zu gestalten.

20.1 Fortgeschrittene Typen und Aliase

20.1.1 Typen und Typ-Aliase

In Go können Sie eigene Typen definieren, um den Code klarer und wartbarer zu machen. Hier ein Beispiel:

package main

import "fmt"

type Age int

func main() {
    var myAge Age = 30
    fmt.Println("My age is:", myAge)
}

In diesem Beispiel definieren wir einen neuen Typ Age, der auf dem eingebauten Typ int basiert. Dies hilft, den Code lesbarer zu machen und zu spezialisieren.

20.2 Verschachtelte Typen und Strukturen

20.2.1 Verschachtelte Strukturen

Strukturen können andere Strukturen enthalten, was es ermöglicht, komplexe Datentypen zu modellieren:

package main

import "fmt"

type Address struct {
    Street string
    City   string
    Zip    string
}

type Person struct {
    Name    string
    Age     int
    Address Address
}

func main() {
    home := Address{"Baker Street", "London", "NW1"}
    person := Person{"Sherlock Holmes", 40, home}

    fmt.Println("Name:", person.Name)
    fmt.Println("Street:", person.Address.Street)
}

In diesem Beispiel enthält die Struktur Person eine Address-Struktur, was es uns ermöglicht, detaillierte Informationen über eine Person zu speichern.

20.3 Methoden und Schnittstellen

20.3.1 Methoden für benutzerdefinierte Typen

Sie können Methoden für benutzerdefinierte Typen definieren, um deren Verhalten zu spezifizieren:

package main

import "fmt"

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

func main() {
    c := Circle{5}
    fmt.Println("Area of circle:", c.Area())
}

Hier definieren wir eine Methode Area für den Typ Circle, die die Fläche des Kreises berechnet.

20.3.2 Schnittstellen

Schnittstellen in Go ermöglichen es, gemeinsame Methoden über verschiedene Typen hinweg zu definieren:

package main

import "fmt"

type Shape interface {
    Area() float64
}

type Rectangle struct {
    Width, Height float64
}

func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

func main() {
    shapes := []Shape{
        Rectangle{2, 3},
        Circle{4},
    }

    for _, shape := range shapes {
        fmt.Println("Area:", shape.Area())
    }
}

In diesem Beispiel definieren wir eine Schnittstelle Shape mit einer Methode Area. Sowohl Rectangle als auch Circle implementieren diese Methode, und wir können beide Typen in einem Slice shapes zusammenfassen und ihre Flächen berechnen.

20.4 Pointer und Referenztypen

20.4.1 Pointer

Pointer sind Variablen, die die Adresse einer anderen Variablen speichern. Sie ermöglichen es, Werte durch Referenz zu übergeben, anstatt durch Kopie:

package main

import "fmt"

func increment(x *int) {
    *x = *x + 1
}

func main() {
    var a int = 10
    increment(&a)
    fmt.Println("Incremented value:", a)
}

In diesem Beispiel wird die Funktion increment mit einem Pointer auf int aufgerufen. Die Funktion erhöht den Wert der Variablen, auf die der Pointer zeigt.

20.5 Verschiedene Arten der Schleifen

20.5.1 For-Schleifen

Die for-Schleife ist die einzige Schleife in Go, aber sie kann auf verschiedene Arten verwendet werden:

20.5.1.1 Klassische for-Schleife

for i := 0; i < 10; i++ {
    fmt.Println(i)
}

20.5.1.2 For-Range Schleife

Die for-range-Schleife iteriert über Slices, Arrays, Maps und Strings:

nums := []int{2, 4, 6, 8, 10}
for index, value := range nums {
    fmt.Printf("Index: %d, Value: %d\n", index, value)
}

20.5.1.3 For-Schleife als While-Schleife

i := 0
for i < 10 {
    fmt.Println(i)
    i++
}

20.6 Verschiedene Arten von Deklarationen

20.6.1 Kurzdeklaration

Go bietet eine Kurzform der Variablendeklaration, die gleichzeitig eine Initialisierung vornimmt:

package main

import "fmt"

func main() {
    x := 10 // Kurzdeklaration und Initialisierung
    fmt.Println("x:", x)
}

20.6.2 Mehrfache Variablendeklaration

Sie können mehrere Variablen in einer einzigen Zeile deklarieren:

package main

import "fmt"

func main() {
    var a, b, c int = 1, 2, 3
    fmt.Println(a, b, c)
}

20.7 Funktionen mit variadischen Parametern

Variadische Funktionen akzeptieren eine variable Anzahl von Argumenten:

package main

import "fmt"

func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

func main() {
    fmt.Println("Sum:", sum(1, 2, 3, 4, 5))
}

In diesem Beispiel akzeptiert die Funktion sum eine variable Anzahl von int-Argumenten und summiert sie.