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.
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.
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.
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.
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.
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.
Die for-Schleife ist die einzige Schleife in Go, aber
sie kann auf verschiedene Arten verwendet werden:
for i := 0; i < 10; i++ {
fmt.Println(i)
}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)
}i := 0
for i < 10 {
fmt.Println(i)
i++
}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)
}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)
}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.