Wozu dient eine leere Struktur in der Go-Sprache?

青灯夜游
Freigeben: 2021-06-07 15:45:37
Original
3089 Leute haben es durchsucht

Verwendung: 1. Wenn Sie die Karte als Set verwenden, können Sie den Werttyp als leere Struktur definieren, die nur als Platzhalter verwendet wird. Der Kanal muss keine Daten senden, kann aber verwendet werden, wenn er nur verwendet wird um Sub-Coroutinen zur Ausführung von Aufgaben usw. zu benachrichtigen. Die leere Struktur wird als Platzhalter verwendet. 3. Wenn die Struktur nur Methoden und keine Felder enthält, kann eine leere Struktur deklariert werden, um Ressourcen zu sparen.

Wozu dient eine leere Struktur in der Go-Sprache?

Die Betriebsumgebung dieses Tutorials: Windows 10-System, GO 1.11.2, Dell G3-Computer.

1. Benötigt eine leere Struktur Platz? In der Go-Sprache können wir unsafe.Sizeof verwenden, um die Anzahl der von einer Datentypinstanz belegten Bytes zu berechnen.
package main

import (
	"fmt"
	"unsafe"
)

func main() {
	fmt.Println(unsafe.Sizeof(struct{}{}))
}
Nach dem Login kopieren

Beim Ausführen des obigen Beispiels wird Folgendes ausgegeben:

$ go run main.go
0
Nach dem Login kopieren

Mit anderen Worten, die leere Strukturinstanz struct{} belegt keinen Speicherplatz.

2. Die Rolle leerer Strukturen

Da leere Strukturen keinen Speicherplatz belegen, werden sie in verschiedenen Szenarien häufig als Platzhalter verwendet. Zum einen sollen Ressourcen gespart werden, zum anderen hat die leere Struktur selbst eine starke Semantik, das heißt, hier ist kein Wert erforderlich, es handelt sich lediglich um einen Platzhalter.

2.1 Set implementieren

Die Standardbibliothek der Go-Sprache stellt keine Implementierung von Set bereit, und stattdessen wird normalerweise Map verwendet. Tatsächlich werden für Sammlungen nur die Schlüssel der Karte benötigt, nicht die Werte. Selbst wenn der Wert auf den Typ Bool festgelegt ist, belegt er 1 Byte mehr. Wenn die Karte eine Million Daten enthält, wird 1 MB Speicherplatz verschwendet.

Wenn Sie also Map als Set verwenden, können Sie den Werttyp als leere Struktur definieren und ihn nur als Platzhalter verwenden. 2.2 Kanal, der keine Daten sendet In diesem Fall bietet sich die Verwendung einer leeren Struktur als Platzhalter sehr gut an.

2.3 Struktur, die nur Methoden enthält

type Set map[string]struct{}

func (s Set) Has(key string) bool {
	_, ok := s[key]
	return ok
}

func (s Set) Add(key string) {
	s[key] = struct{}{}
}

func (s Set) Delete(key string) {
	delete(s, key)
}

func main() {
	s := make(Set)
	s.Add("Tom")
	s.Add("Sam")
	fmt.Println(s.Has("Tom"))
	fmt.Println(s.Has("Jack"))
}
Nach dem Login kopieren
In einigen Szenarien enthält die Struktur nur Methoden und keine Felder. Zum Beispiel Door im obigen Beispiel. In diesem Fall kann Door tatsächlich durch eine beliebige Datenstruktur ersetzt werden. Zum Beispiel:
func worker(ch chan struct{}) {
	<-ch
	fmt.Println("do something")
	close(ch)
}

func main() {
	ch := make(chan struct{})
	go worker(ch)
	ch <- struct{}{}
}
Nach dem Login kopieren
Ob es sich um int oder bool handelt, es wird zusätzlicher Speicher verschwendet. Daher ist es in diesem Fall am besten, eine leere Struktur zu deklarieren.

Empfohlenes Lernen:

Golang-Tutorial

Das obige ist der detaillierte Inhalt vonWozu dient eine leere Struktur in der Go-Sprache?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage