suchen
HeimBackend-EntwicklungGolangTauchen Sie tief in Go Struct ein

In Go ist struct ein Aggregattyp, der zum Definieren und Kapseln von Daten verwendet wird. Es ermöglicht die Kombination von Feldern unterschiedlicher Art. Strukturen können als benutzerdefinierte Datentypen betrachtet werden, ähnlich wie Klassen in anderen Sprachen, sie unterstützen jedoch keine Vererbung. Methoden sind Funktionen, die einem bestimmten Typ (häufig einer Struktur) zugeordnet sind und mit einer Instanz dieses Typs aufgerufen werden können.

Strukturen definieren und initialisieren

Definieren einer Struktur

Strukturen werden mithilfe der Schlüsselwörter type und struct definiert. Hier ist ein Beispiel für eine einfache Strukturdefinition:

type User struct {
  Username    string
  Email       string
  SignInCount int
  IsActive    bool
}

Initialisieren einer Struktur

Strukturen können auf verschiedene Arten initialisiert werden.

Initialisierung mit Feldnamen

user1 := User{
  Username:    "alice",
  Email:       "alice@example.com",
  SignInCount: 1,
  IsActive:    true,
}

Initialisierung mit Standardwerten

Wenn einige Felder nicht angegeben sind, werden sie auf ihre Nullwerte für die jeweiligen Typen initialisiert.

user2 := User{
  Username: "bob",
}

In diesem Beispiel wird Email mit einer leeren Zeichenfolge ("") initialisiert, SignInCount auf 0 und IsActive auf false.

Initialisierung mit einem Zeiger

Eine Struktur kann auch mit einem Zeiger initialisiert werden.

user3 := &User{
  Username: "charlie",
  Email:    "charlie@example.com",
}

Methoden und Verhalten von Strukturen

In Go dienen Strukturen nicht nur zum Speichern von Daten, sondern es können auch Methoden für sie definiert werden. Dies ermöglicht es Strukturen, Verhalten im Zusammenhang mit ihren Daten zu kapseln. Nachfolgend finden Sie eine detaillierte Erläuterung der Strukturmethoden und des Verhaltens.

Methoden für Strukturen definieren

Methoden werden mithilfe eines Empfängers definiert, der der erste Parameter der Methode ist und den Typ angibt, zu dem die Methode gehört. Der Empfänger kann entweder ein Wertempfänger oder ein Zeigerempfänger sein.

Wertempfänger

Ein Wertempfänger erstellt eine Kopie der Struktur, wenn die Methode aufgerufen wird, sodass Änderungen an Feldern keine Auswirkungen auf die ursprüngliche Struktur haben.

type User struct {
  Username string
  Email    string
}

func (u User) PrintInfo() {
  fmt.Printf("Username: %s, Email: %s\n", u.Username, u.Email)
}

Zeigerempfänger

Ein Zeigerempfänger ermöglicht der Methode, die ursprünglichen Strukturfelder direkt zu ändern.

func (u *User) UpdateEmail(newEmail string) {
  u.Email = newEmail
}

Methodensätze

In Go bilden alle Methoden einer Struktur ihren Methodensatz. Der Methodensatz für einen Wertempfänger umfasst alle Methoden mit Wertempfängern, während der Methodensatz für einen Zeigerempfänger alle Methoden mit Zeiger- und Wertempfängern umfasst.

Schnittstellen und Strukturmethoden

Strukturmethoden werden häufig mit Schnittstellen verwendet, um Polymorphismus zu erreichen. Beim Definieren einer Schnittstelle geben Sie die Methoden an, die eine Struktur implementieren muss.

type UserInfo interface {
  PrintInfo()
}

// User implements the UserInfo interface
func (u User) PrintInfo() {
  fmt.Printf("Username: %s, Email: %s\n", u.Username, u.Email)
}

func ShowInfo(ui UserInfo) {
  ui.PrintInfo()
}

Speicherausrichtung in Strukturen

In Go soll die Speicherausrichtung für Strukturen die Zugriffseffizienz verbessern. Verschiedene Datentypen haben spezifische Ausrichtungsanforderungen, und der Compiler kann Füllbytes zwischen Strukturfeldern einfügen, um diese Anforderungen zu erfüllen.

Was ist Gedächtnisausrichtung?

Speicherausrichtung bedeutet, dass sich Daten im Speicher an Adressen befinden müssen, die ein Vielfaches bestimmter Werte sind. Die Größe eines Datentyps bestimmt seine Ausrichtungsanforderung. Beispielsweise erfordert int32 eine Ausrichtung auf 4 Bytes und int64 eine Ausrichtung auf 8 Bytes.

Warum ist eine Gedächtnisausrichtung notwendig?

Effizienter Speicherzugriff ist entscheidend für die CPU-Leistung. Wenn eine Variable nicht richtig ausgerichtet ist, benötigt die CPU möglicherweise mehrere Speicherzugriffe, um Daten zu lesen oder zu schreiben, was zu Leistungseinbußen führt. Durch die Ausrichtung der Daten sorgt der Compiler für einen effizienten Speicherzugriff.

Regeln für die Strukturgedächtnisausrichtung

  • Feldausrichtung: Die Adresse jedes Felds muss die Ausrichtungsanforderungen seines Typs erfüllen. Der Compiler kann Füllbytes zwischen Feldern einfügen, um eine ordnungsgemäße Ausrichtung sicherzustellen.
  • Strukturausrichtung: Die Größe einer Struktur muss ein Vielfaches der größten Ausrichtungsanforderung unter ihren Feldern sein.

Beispiel:

type User struct {
  Username    string
  Email       string
  SignInCount int
  IsActive    bool
}

Ausgabe: 12

Analyse:

  • a ist int8, belegt 1 Byte und ist auf 1 ausgerichtet.
  • b ist int32 und erfordert eine Ausrichtung auf 4 Bytes. Der Compiler fügt 3 Füllbytes zwischen a und b ein, um die Adresse von b auf 4 auszurichten.
  • c ist int8 und erfordert 1 Byte, aber die Gesamtgröße der Struktur muss ein Vielfaches von 4 sein (die größte Ausrichtungsanforderung). Der Compiler fügt am Ende 3 Füllbytes hinzu.

Optimierung der Speicherausrichtung

Sie können Strukturfelder neu anordnen, um das Auffüllen zu minimieren und die Speichernutzung zu reduzieren.

user1 := User{
  Username:    "alice",
  Email:       "alice@example.com",
  SignInCount: 1,
  IsActive:    true,
}

Ausgabe: 8

In dieser optimierten Version wird b zuerst platziert und auf 4 Bytes ausgerichtet. a und c werden nacheinander platziert, sodass die Gesamtgröße 8 Byte beträgt, was kompakter ist als die nicht optimierte Version.

Zusammenfassung

  • Strukturfeldern in Go wird Speicher basierend auf ihren Ausrichtungsanforderungen zugewiesen, mit potenziellen Füllbytes.
  • Durch Anpassen der Reihenfolge der Felder kann das Auffüllen minimiert und die Speichernutzung optimiert werden.
  • Verwenden Sie unsafe.Sizeof, um die tatsächliche Speichergröße einer Struktur zu bestimmen.

Verschachtelte Strukturen und Zusammensetzung

In Go sind verschachtelte Strukturen und Kompositionen leistungsstarke Werkzeuge für die Wiederverwendung von Code und die Organisation komplexer Daten. Verschachtelte Strukturen ermöglichen es einer Struktur, eine andere Struktur als Feld einzuschließen, was die Erstellung komplexer Datenmodelle ermöglicht. Die Komposition hingegen erstellt neue Strukturen, indem sie andere Strukturen einschließt, was die Wiederverwendung von Code erleichtert.

Verschachtelte Strukturen

Verschachtelte Strukturen ermöglichen es einer Struktur, eine andere Struktur als Feld einzuschließen. Dadurch werden Datenstrukturen flexibler und organisierter. Hier ist ein Beispiel für eine verschachtelte Struktur:

type User struct {
  Username    string
  Email       string
  SignInCount int
  IsActive    bool
}

Strukturzusammensetzung

Composition ermöglicht die Kombination mehrerer Strukturen zu einer neuen Struktur und ermöglicht so die Wiederverwendung von Code. In der Komposition kann eine Struktur mehrere andere Strukturen als Felder enthalten. Dies hilft dabei, komplexere Modelle zu erstellen und gemeinsame Felder oder Methoden zu teilen. Hier ist ein Beispiel für die Strukturzusammensetzung:

user1 := User{
  Username:    "alice",
  Email:       "alice@example.com",
  SignInCount: 1,
  IsActive:    true,
}

Unterschiede zwischen verschachtelten Strukturen und Zusammensetzung

  • Verschachtelte Strukturen: Wird verwendet, um Strukturen miteinander zu kombinieren, wobei der Typ eines Feldes in einer Struktur einer anderen Struktur entspricht. Dieser Ansatz wird häufig verwendet, um Datenmodelle mit hierarchischen Beziehungen zu beschreiben.
  • Zusammensetzung: Ermöglicht einer Struktur, Felder aus mehreren anderen Strukturen einzuschließen. Diese Methode wird verwendet, um die Wiederverwendung von Code zu erreichen, sodass eine Struktur komplexere Verhaltensweisen und Attribute aufweisen kann.

Zusammenfassung

Verschachtelte Strukturen und Komposition sind leistungsstarke Funktionen in Go, die bei der Organisation und Verwaltung komplexer Datenstrukturen helfen. Beim Entwerfen von Datenmodellen kann die Verwendung verschachtelter Strukturen und die entsprechende Zusammensetzung Ihren Code klarer und wartbarer machen.

Leere Struktur

Eine leere Struktur in Go ist eine Struktur ohne Felder.

Größe und Speicheradresse

Eine leere Struktur belegt null Byte Speicher. Allerdings kann seine Speicheradresse unter verschiedenen Umständen gleich sein oder auch nicht. Wenn ein Speicher-Escape auftritt, sind die Adressen gleich und zeigen auf runtime.zerobase.

user2 := User{
  Username: "bob",
}

Aus der Ausgabe geht hervor, dass die Variablen a, b und Zerobase dieselbe Adresse haben und alle auf die globale Variable runtime.zerobase (runtime/malloc.go) verweisen.

Bezüglich Fluchtszenarien:

  • Variablen c und d entkommen auf den Heap. Ihre Adressen sind 0x590d00 und sie sind im Vergleich gleich (wahr).
  • Variablen e und f haben unterschiedliche Adressen (0xc00008ef47) und sind im Vergleich ungleich (falsch).

Dieses Verhalten ist in Go beabsichtigt. Wenn leere Strukturvariablen nicht maskiert werden, sind ihre Zeiger ungleich. Nach dem Escape werden die Zeiger gleich.

Platzberechnung beim Einbetten leerer Strukturen

Eine leere Struktur selbst belegt keinen Platz, aber wenn sie in eine andere Struktur eingebettet ist, kann sie abhängig von ihrer Position Platz verbrauchen:

  • Wenn es das einzige Feld in der Struktur ist, belegt die Struktur keinen Platz.
  • Wenn es sich um das erste oder mittlere Feld handelt, nimmt es keinen Platz ein.
  • Wenn es das letzte Feld ist, belegt es den gleichen Platz wie das vorherige Feld.
user3 := &User{
  Username: "charlie",
  Email:    "charlie@example.com",
}

Wenn leere Strukturen Elemente von Arrays oder Slices sind:

type User struct {
  Username string
  Email    string
}

func (u User) PrintInfo() {
  fmt.Printf("Username: %s, Email: %s\n", u.Username, u.Email)
}

Anwendungen

Die Eigenschaft der Nullgröße leerer Strukturen ermöglicht deren Verwendung für verschiedene Zwecke ohne zusätzlichen Speicheraufwand.

Verhindern Sie die Initialisierung nicht verschlüsselter Strukturen

type User struct {
  Username    string
  Email       string
  SignInCount int
  IsActive    bool
}

Implementieren einer festgelegten Datenstruktur

user1 := User{
  Username:    "alice",
  Email:       "alice@example.com",
  SignInCount: 1,
  IsActive:    true,
}

Signalübertragung über Kanäle

Manchmal ist der Inhalt der über einen Kanal übertragenen Daten irrelevant und dient nur als Signal. Leere Strukturen können beispielsweise in Semaphor-Implementierungen verwendet werden:

user2 := User{
  Username: "bob",
}

Wir sind Leapcell, Ihre erste Wahl für die Bereitstellung von Go-Projekten in der Cloud.

Deep Dive into Go Struct

Leapcell ist die serverlose Plattform der nächsten Generation für Webhosting, Async-Aufgaben und Redis:

  1. Mehrsprachige Unterstützung
  • Entwickeln Sie mit JavaScript, Python, Go oder Rust.
  1. Stellen Sie unbegrenzt viele Projekte kostenlos bereit
  • Zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
  1. Unschlagbare Kosteneffizienz
  • Pay-as-you-go ohne Leerlaufgebühren.
  • Beispiel: 25 $ unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
  1. Optimierte Entwicklererfahrung
  • Intuitive Benutzeroberfläche für mühelose Einrichtung.
  • Vollautomatische CI/CD-Pipelines und GitOps-Integration.
  • Echtzeitmetriken und Protokollierung für umsetzbare Erkenntnisse.
  1. Mühelose Skalierbarkeit und hohe Leistung
  • Automatische Skalierung zur problemlosen Bewältigung hoher Parallelität.
  • Kein Betriebsaufwand – konzentrieren Sie sich nur auf das Bauen.

Erfahren Sie mehr in der Dokumentation!

Folgen Sie uns auf X: @LeapcellHQ


Lesen Sie auf unserem Blog

Das obige ist der detaillierte Inhalt vonTauchen Sie tief in Go Struct ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Golang gegen Python: Die Vor- und NachteileGolang gegen Python: Die Vor- und NachteileApr 21, 2025 am 12:17 AM

GolangissidealforbuildingsCalablesSystemduetoitseffizienz und Konsumverkehr, whilepythonexcelsinquickScriptingandDataanalyseduetoitssimplication und VacevastEcosystem.golangsDesineScouragesCouragescournations, tadelcodedeanDitsGoroutaTinoutgoroutaTinoutgoroutaTinoutsGoroutinesGoroutinesGoroutsGoroutins, t

Golang und C: Parallelität gegen RohgeschwindigkeitGolang und C: Parallelität gegen RohgeschwindigkeitApr 21, 2025 am 12:16 AM

Golang ist in Gleichzeitigkeit besser als C, während C bei Rohgeschwindigkeit besser als Golang ist. 1) Golang erreicht durch Goroutine und Kanal eine effiziente Parallelität, die zum Umgang mit einer großen Anzahl von gleichzeitigen Aufgaben geeignet ist. 2) C über Compiler -Optimierung und Standardbibliothek bietet es eine hohe Leistung in der Nähe der Hardware, die für Anwendungen geeignet ist, die eine extreme Optimierung erfordern.

Warum Golang verwenden? Vorteile und Vorteile erläutertWarum Golang verwenden? Vorteile und Vorteile erläutertApr 21, 2025 am 12:15 AM

Gründe für die Auswahl von Golang umfassen: 1) Leistung mit hoher Genauigkeit, 2) statisches System, 3) Mechanismusmechanismus, 4) Reiche Standardbibliotheken und Ökosysteme, die es zu einer idealen Wahl für die Entwicklung einer effizienten und zuverlässigen Software machen.

Golang gegen C: Leistung und GeschwindigkeitsvergleichGolang gegen C: Leistung und GeschwindigkeitsvergleichApr 21, 2025 am 12:13 AM

Golang ist für schnelle Entwicklung und gleichzeitige Szenarien geeignet, und C ist für Szenarien geeignet, in denen extreme Leistung und Kontrolle auf niedriger Ebene erforderlich sind. 1) Golang verbessert die Leistung durch Müllsammlung und Parallelitätsmechanismen und eignet sich für die Entwicklung von Webdiensten mit hoher Konsequenz. 2) C erreicht die endgültige Leistung durch das manuelle Speicherverwaltung und die Compiler -Optimierung und eignet sich für eingebettete Systementwicklung.

Ist Golang schneller als C? Erforschung der GrenzenIst Golang schneller als C? Erforschung der GrenzenApr 20, 2025 am 12:19 AM

Golang erzielt eine bessere Kompilierungszeit und gleichzeitige Verarbeitung, während C mehr Vorteile bei der Ausführung von Geschwindigkeit und Speicherverwaltung hat. 1. Golang hat eine schnelle Kompilierungsgeschwindigkeit und ist für eine schnelle Entwicklung geeignet. 2.C läuft schnell und eignet sich für leistungskritische Anwendungen. 3. Golang ist einfach und effizient in der gleichzeitigen Verarbeitung, geeignet für die gleichzeitige Programmierung. 4. C Manual Memory Management bietet eine höhere Leistung, erhöht jedoch die Komplexität der Entwicklung.

Golang: Von Webdiensten über SystemprogrammeGolang: Von Webdiensten über SystemprogrammeApr 20, 2025 am 12:18 AM

Die Anwendung von Golang in Webdiensten und Systemprogrammen spiegelt sich hauptsächlich in seiner Einfachheit, Effizienz und Parallelität wider. 1) In Webdiensten unterstützt Golang die Erstellung von Hochleistungs-Webanwendungen und APIs durch leistungsstarke HTTP-Bibliotheken und gleichzeitige Verarbeitungsfunktionen. 2) Bei der Systemprogrammierung verwendet Golang Funktionen in der Nähe von Hardware und Kompatibilität mit der C -Sprache, um für Betriebssystementwicklung und eingebettete Systeme geeignet zu sein.

Golang gegen C: Benchmarks und reale LeistungGolang gegen C: Benchmarks und reale LeistungApr 20, 2025 am 12:18 AM

Golang und C haben ihre eigenen Vor- und Nachteile im Leistungsvergleich: 1. Golang ist für hohe Parallelität und schnelle Entwicklung geeignet, aber die Müllsammlung kann die Leistung beeinflussen. 2.C bietet eine höhere Leistung und Hardwarekontrolle, weist jedoch eine hohe Entwicklungskomplexität auf. Bei der Entscheidung müssen Sie Projektanforderungen und Teamkenntnisse auf umfassende Weise berücksichtigen.

Golang gegen Python: Eine vergleichende AnalyseGolang gegen Python: Eine vergleichende AnalyseApr 20, 2025 am 12:17 AM

Golang eignet sich für Hochleistungs- und gleichzeitige Programmierszenarien, während Python für die schnelle Entwicklung und Datenverarbeitung geeignet ist. 1. Golang betont Einfachheit und Effizienz und eignet sich für Back-End-Dienste und Microservices. 2. Python ist bekannt für seine prägnante Syntax und reiche Bibliotheken, die für Datenwissenschaft und maschinelles Lernen geeignet sind.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),