Übung: Verwenden von Strukturen
Manchmal müssen Sie eine Sammlung von Feldern in einer Struktur darstellen. Wenn Sie beispielsweise ein Programm für Lohnabrechnungen schreiben möchten, müssen Sie eine Mitarbeiterdatenstruktur verwenden. In Go können Sie Strukturen zum Gruppieren verschiedener Felder verwenden, die einen Datensatz bilden können.
Eine Struktur in Go ist ein weiterer Datentyp, der null oder mehr Felder beliebiger Typen enthalten und diese als einzelne Entität darstellen kann.
In diesem Abschnitt wird erläutert, warum Strukturen unverzichtbar sind und wie Sie diese verwenden.
Deklarieren und Initialisieren einer Struktur
Sie müssen zum Deklarieren einer Struktur das Schlüsselwort struct
zusammen mit der Liste der Felder und deren Typen verwenden, die der neue Datentyp aufweisen soll. Sie können zum Definieren einer Mitarbeiterstruktur beispielsweise den folgenden Code verwenden:
type Employee struct {
ID int
FirstName string
LastName string
Address string
}
Anschließend können Sie eine Variable mit dem neuen Typ deklarieren, wie Sie es in der Regel bei anderen Typen tun. Beispiel:
var john Employee
Wenn Sie eine Variable gleichzeitig deklarieren und initialisieren möchten, können Sie wie folgt vorgehen:
employee := Employee{1001, "John", "Doe", "Doe's Street"}
Beachten Sie, dass Sie einen Wert für jedes der Felder aus der Struktur angeben müssen. Dies kann jedoch manchmal problematisch sein. Alternativ können Sie in Bezug auf die Felder, die Sie in einer Struktur initialisieren möchten, spezifischer vorgehen:
employee := Employee{LastName: "Doe", FirstName: "John"}
Beachten Sie, dass die Reihenfolge, in der Sie den einzelnen Feldern Werte zuweisen, in der vorherigen Anweisung keine Rolle spielt. Außerdem ist es unwichtig, ob Sie einen Wert für ein anderes Feld angeben. Go weist abhängig vom Felddatentyp einen Standardwert zu.
Wenn Sie auf einzelne Felder einer Struktur zugreifen möchten, können Sie wie in diesem Beispiel die Punktnotation (.
) verwenden:
employee.ID = 1001
fmt.Println(employee.FirstName)
Schließlich können Sie den &
-Operator verwenden, um wie im folgenden Code veranschaulicht einen Zeiger auf die Struktur zu erstellen:
package main
import "fmt"
type Employee struct {
ID int
FirstName string
LastName string
Address string
}
func main() {
employee := Employee{LastName: "Doe", FirstName: "John"}
fmt.Println(employee)
employeeCopy := &employee
employeeCopy.FirstName = "David"
fmt.Println(employee)
}
Wenn Sie den vorherigen Code ausführen, wird die folgende Ausgabe angezeigt:
{0 John Doe }
{0 David Doe }
Beachten Sie, dass die Struktur bei der Verwendung von Zeigern variabel wird.
Einbetten einer Struktur
Mithilfe von Strukturen in Go können Sie eine andere Struktur in eine Struktur einbetten. In manchen Fällen möchten Sie möglicherweise Wiederholungen reduzieren und eine gemeinsame Struktur verwenden. Angenommen, dass Sie beispielsweise den vorherigen Code so umgestalten möchten, dass er einen Datentyp für einen Mitarbeiter und einen weiteren für einen Vertragspartner enthält. Sie könnten eine Person
-Struktur verwenden, die allgemeine Felder wie in diesem Beispiel enthält:
type Person struct {
ID int
FirstName string
LastName string
Address string
}
Sie können dann andere Typen deklarieren, die einen Person
-Typ wie Employee
und Contractor
einbetten. Sie erstellen wie in diesem Beispiel ein neues Feld, um eine andere Struktur einzubetten:
type Employee struct {
Information Person
ManagerID int
}
Sie müssen wie in diesem Beispiel das Information
-Feld von einer Mitarbeitervariablen einschließen, um auf ein Feld aus der Person
-Struktur zu verweisen.
var employee Employee
employee.Information.FirstName = "John"
Wenn Sie Code wie in diesem Fall umgestalten, würde dies den Code beeinträchtigen. Alternativ dazu können Sie wie in diesem Beispiel ein neues Feld mit demselben Namen der Struktur einschließen, die Sie einbetten:
type Employee struct {
Person
ManagerID int
}
Zur Veranschaulichung können Sie den folgenden Code verwenden:
package main
import "fmt"
type Person struct {
ID int
FirstName string
LastName string
Address string
}
type Employee struct {
Person
ManagerID int
}
type Contractor struct {
Person
CompanyID int
}
func main() {
employee := Employee{
Person: Person{
FirstName: "John",
},
}
employee.LastName = "Doe"
fmt.Println(employee.FirstName)
}
Beachten Sie, dass Sie über eine Employee
-Struktur auf das FirstName
-Feld zugreifen, ohne dabei das Feld Person
angeben zu müssen, da es alle Felder automatisch einbettet. Wenn Sie jedoch eine Struktur initialisieren, müssen Sie genau wissen, welchem Feld Sie einen Wert zuweisen möchten.
Codieren und Decodieren von Strukturen mit JSON
Schließlich können Sie Strukturen zum Codieren und Decodieren von Daten in JSON verwenden. Go bietet hervorragende Unterstützung für das JSON-Format, das bereits in den Standardbibliothekspaketen enthalten ist.
Sie können auch den Namen eines Felds aus der Struktur ändern. Angenommen, Sie möchten beispielsweise, dass in der JSON-Ausgabe nicht FirstName
, sondern nur name
angezeigt wird, oder dass leere Felder ignoriert werden. Sie könnten wie in diesem Beispiel gezeigt Feldtags verwenden:
type Person struct {
ID int
FirstName string `json:"name"`
LastName string
Address string `json:"address,omitempty"`
}
Verwenden Sie dann die json.Marshal
-Funktion, um eine Struktur im JSON-Format zu codieren. Zum Decodieren einer JSON-Zeichenfolge in eine Datenstruktur verwenden Sie die json.Unmarshal
-Funktion. Im Folgenden finden Sie ein Gesamtbeispiel für das Codieren eines Arrays von Mitarbeitern ins JSON-Format und das Decodieren der Ausgabe in eine neue Variable:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
ID int
FirstName string `json:"name"`
LastName string
Address string `json:"address,omitempty"`
}
type Employee struct {
Person
ManagerID int
}
type Contractor struct {
Person
CompanyID int
}
func main() {
employees := []Employee{
Employee{
Person: Person{
LastName: "Doe", FirstName: "John",
},
},
Employee{
Person: Person{
LastName: "Campbell", FirstName: "David",
},
},
}
data, _ := json.Marshal(employees)
fmt.Printf("%s\n", data)
var decoded []Employee
json.Unmarshal(data, &decoded)
fmt.Printf("%v", decoded)
}
Wenn Sie den vorherigen Code ausführen, wird die folgende Ausgabe angezeigt:
[{"ID":0,"name":"John","LastName":"Doe","ManagerID":0},{"ID":0,"name":"David","LastName":"Campbell","ManagerID":0}]
[{{0 John Doe } 0} {{0 David Campbell } 0}]