Strukturen in Golang

GolangGolangBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Eine Struktur (struct) ist ein zusammengesetzter Datentyp, der verwendet werden kann, um verschiedene Datentypen zu speichern. Sie kann eingesetzt werden, um komplexere Datenstrukturen zu implementieren. Beispielsweise haben die Artikel in einem Nahversorgungsgeschäft Attribute wie Produktname, Kategorie und Preis. Wir können eine Struktur verwenden, um sie darzustellen.

In diesem Lab (LabEx) werden wir lernen, wie man Strukturen definiert und verwendet.

Wissenspunkte:

  • Definition einer Struktur
  • Methoden einer Strukturinstanz

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/DataTypesandStructuresGroup(["Data Types and Structures"]) go(("Golang")) -.-> go/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) go(("Golang")) -.-> go/BasicsGroup(["Basics"]) go/BasicsGroup -.-> go/values("Values") go/BasicsGroup -.-> go/variables("Variables") go/DataTypesandStructuresGroup -.-> go/structs("Structs") go/DataTypesandStructuresGroup -.-> go/pointers("Pointers") go/ObjectOrientedProgrammingGroup -.-> go/methods("Methods") subgraph Lab Skills go/values -.-> lab-149097{{"Strukturen in Golang"}} go/variables -.-> lab-149097{{"Strukturen in Golang"}} go/structs -.-> lab-149097{{"Strukturen in Golang"}} go/pointers -.-> lab-149097{{"Strukturen in Golang"}} go/methods -.-> lab-149097{{"Strukturen in Golang"}} end

Definition einer Struktur

Wir können die Schlüsselwörter type und struct verwenden, um eine Struktur zu definieren. Die Syntax ist wie folgt:

type StructName struct {
    FieldName Type
    //...
}

Dabei gilt:

  • Type repräsentiert den spezifischen Datentyp des Feldnamens, der eine Ganzzahl, ein String usw. sein kann.
  • StructName muss innerhalb desselben Pakets eindeutig sein.
  • Die Feldnamen müssen innerhalb derselben Struktur eindeutig sein.

Lassen Sie uns es ausprobieren. Definieren wir einen Nahversorgungsmarkt:

type Store struct {
    ProductType string // product type
    ProductName string // product name
    Price       int    // product price
}

Im obigen Code definieren wir eine Struktur namens Store für den Nahversorgungsmarkt, die den Typ, den Namen und den Preis des Produkts umfasst.

Da die Felder für den Produkttyp und den Produktnamen denselben Datentyp haben, können wir den Code wie folgt vereinfachen:

type Store struct {
    ProductName, ProductType string
    Price                   int
}

Instanziierung mit var

Im vorherigen Abschnitt haben wir eine Struktur Store für einen Nahversorgungsmarkt definiert, die den Speicherplatz beschreibt. Erst nach der Instanziierung wird Speicher zugewiesen und können die Felder der Struktur verwendet werden.

Wir können das Schlüsselwort var verwenden, um eine Struktur zu instanziieren:

var InstanceName Structure

Schauen wir uns ein Beispiel für die Instanziierung an. Erstellen Sie eine Datei namens struct.go und schreiben Sie folgenden Code:

cd ~/project
touch struct.go
package main

import "fmt"

type Store struct {
    productName string
    productType string
    price       int
}

func main() {
    // Instantiate a structure using `var`
    var store1 Store
    // Assign values to the fields related to the instance store1
    store1.productType = "Drinks"
    store1.productName = "Coca-Cola"
    store1.price = 3

    fmt.Printf("store1:\n\t%s\n\t%s\n\t%d\n",
        store1.productType, store1.productName, store1.price)
}

Führen Sie das Programm aus:

go run struct.go

Nach dem Ausführen wird folgendes Ergebnis angezeigt:

store1:
Drinks
Coca-Cola
3

In diesem Programm haben wir einen Nahversorgungsmarkt mit var instanziiert und dann mithilfe des .-Operators seinen Feldern Werte zugewiesen.

Initialwert einer Struktur

Was ist der Wert einer instanziierten Struktur, wenn wir sie nur initialisieren, ohne einen Wert zuzuweisen? Schauen wir uns folgenden Code an:

package main

import "fmt"

type Store struct {
    ProductName string
    ProductType string
    Price       int
}

func main() {
    // Instantiate a structure using `var`
    var lan1 Store
    // Print the structure value using %#v
    fmt.Printf("lan1: %#v\n", lan1)
}

Führen Sie das Programm aus:

go run struct.go

Das Ergebnis ist wie folgt:

lan1: main.Store{ProductName:"", ProductType:"", Price:0}

Wir können sehen, dass, wenn kein Initialwert angegeben wird, der Wert der instanziierten Struktur der Nullwert des entsprechenden Datentyps ist. Beispielsweise ist der String leer und die Ganzzahl 0.

Instanziierung mit new

Neben der Instanziierung mit dem Schlüsselwort var können wir auch das Schlüsselwort new verwenden:

package main

import "fmt"

type Store struct {
    productName string
    productType string
    price       int
}

func main() {
    store := new(Store)
    // Use %T to output the type
    fmt.Printf("Type of store: %T\n", store)

    store.productType = "Daily Necessities"
    store.productName = "Umbrella"
    store.price = 20

    fmt.Printf("store:\n\t%s\n\t%s\n\t%d\n",
        store.productType, store.productName, store.price)
}

Führen Sie das Programm aus:

go run struct.go

Das Ergebnis ist wie folgt:

Type of store: *main.Store
store:
        Daily Necessities
        Umbrella
        20

Beim Verwenden des Schlüsselworts new für die Instanziierung ist die "Instanz", die es erstellt, tatsächlich ein Zeiger auf die Instanz. Die Operation des Zuweisens eines Werts an den Strukturzeiger ist dieselbe wie das Zuweisen eines Werts an eine normale Struktur.

Instanziierung mit :=

Ähnlich können wir := verwenden, um eine Struktur zu instanziieren:

package main

import "fmt"

type Store struct {
    productName string
    productType string
    price       int
}

func main() {
    lan3 := Store{}
    lan3.productType = "Fresh Food"
    lan3.productName = "Taiwanese Meatballs"
    lan3.price = 20
    fmt.Printf("lan3:\n\t%s\n\t%s\n\t%d\n",
        lan3.productType, lan3.productName, lan3.price)
}

Führen Sie das Programm aus:

go run struct.go

Das Ergebnis ist wie folgt:

lan3:
    Fresh Food
    Taiwanese Meatballs
    20

Wir können Initialisierung und Zuweisung zusammen schreiben, wie hier:

package main

import "fmt"

type Store struct {
    productName string
    productType string
    price       int
}

func main() {
    lan3 := Store{
        productType: "Fresh Food",
        productName: "Taiwanese Meatballs",
        price:       4,
    }
    fmt.Printf("lan3:\n\t%s\n\t%s\n\t%d\n",
        lan3.productType, lan3.productName, lan3.price)
}

Führen Sie das Programm aus:

go run struct.go

Das Ergebnis ist wie folgt:

lan3:
    Fresh Food
    Taiwanese Meatballs
    4

Wenn wir allen Feldern einer Struktur Werte zuweisen müssen, können wir die Werte in der Reihenfolge schreiben, in der sie in der Struktur definiert sind.

Beispielsweise können wir die Instanz lan3 wie folgt umschreiben:

lan3 := Store{
        "Fresh Food",
        "Taiwanese Meatballs",
        4,
    }

Hinweis: Diese Syntax ist nur für Fälle geeignet, in denen allen Feldern Werte zugewiesen werden.

Zusammenfassung

In diesem Lab haben wir Strukturen eingeführt und die folgenden Wissenspunkte zusammengefasst:

  • Strukturen sind zusammengesetzte Datentypen, die mehrere verschiedene Datentypen enthalten können.
  • Der Wert einer nicht initialisierten Struktur ist der Nullwert des entsprechenden Datentyps.
  • Drei Methoden zur Instanziierung einer Struktur.