Heim >Backend-Entwicklung >Golang >Verfügt die Go-Sprache über eine festgelegte Sammlung?
Go-Sprache verfügt nicht über eine festgelegte Sammlung. Set ist ein Set, und die Elemente im Set können nicht wiederholt werden. In der Standardbibliothek von Golang gibt es keine Operation für Set, aber es gibt zwei Implementierungsmethoden: 1. Verwenden Sie die Kartenimplementierung. Der Schlüssel in der Karte ist ein eindeutiger Wert stimmt mit den Eigenschaften von set ;2 überein. Verwenden Sie zur Implementierung das Paket golang-set.
Die Betriebsumgebung dieses Tutorials: Windows 10-System, GO 1.11.2, Dell G3-Computer.
Go stellt den Set-Typ nicht zur Verfügung. Set ist ein Set und die Elemente im Set können nicht wiederholt werden. Sie können jedoch zwei Methoden verwenden, um die Sammlung festzulegen:
map
golang-set
Map zum Implementieren verwenden
In Golang wird die Karte normalerweise zum Implementieren von Set verwendet Der Schlüssel in der Karte ist ein eindeutiger Wert, der mit den Eigenschaften der Menge übereinstimmt.
Einfache Implementierung wie folgt:
set := make(map[string]bool) // New empty set set["Foo"] = true // Add for k := range set { // Loop fmt.Println(k) } delete(set, "Foo") // Delete size := len(set) // Size exists := set["Foo"] // Membership
Der Wert von map ist boolesch, was dazu führt, dass set mehr Speicherplatz belegt. Um dieses Problem zu lösen, können Sie es durch eine leere Struktur ersetzen. In Go verbrauchen leere Strukturen normalerweise keinen Speicher.
unsafe.Sizeof(struct{}{}) // 结果为 0
Nach der Optimierung lautet es wie folgt:
type void struct{} var member void set := make(map[string]void) // New empty set set["Foo"] = member // Add for k := range set { // Loop fmt.Println(k) } delete(set, "Foo") // Delete size := len(set) // Size _, exists := set["Foo"] // Membership
golang-set
golang-set – Ein einfacher Set-Typ für die Go-Sprache. Wird auch von Docker, 1Password und Ethereum verwendet.
Bereits verfügbar auf github Ein ausgereiftes Paket namens golang-set bietet threadsichere und nicht threadsichere Sets. Es stehen fünf festgelegte Funktionen zur Verfügung:
// NewSet创建并返回空集的引用,结果集上的操作是线程安全的 func NewSet(s ...interface{}) Set {} // NewSetFromSlice从现有切片创建并返回集合的引用,结果集上的操作是线程安全的 func NewSetFromSlice(s []interface{}) Set {} // NewSetWith创建并返回具有给定元素的新集合,结果集上的操作是线程安全的 func NewSetWith(elts ...interface{}) Set {} // NewThreadUnsafeSet创建并返回对空集的引用,结果集上的操作是非线程安全的 func NewThreadUnsafeSet() Set {} // NewThreadUnsafeSetFromSlice创建并返回对现有切片中集合的引用,结果集上的操作是非线程安全的。 func NewThreadUnsafeSetFromSlice(s []interface{}) Set {}
Einfacher Fall wie folgt:
package main import ( "fmt" "github.com/deckarep/golang-set" ) func main() { // 默认创建的线程安全的,如果无需线程安全 // 可以使用 NewThreadUnsafeSet 创建,使用方法都是一样的。 s1 := mapset.NewSet(1, 2, 3, 4) fmt.Println("s1 contains 3: ", s1.Contains(3)) fmt.Println("s1 contains 5: ", s1.Contains(5)) // interface 参数,可以传递任意类型 s1.Add("poloxue") fmt.Println("s1 contains poloxue: ", s1.Contains("poloxue")) s1.Remove(3) fmt.Println("s1 contains 3: ", s1.Contains(3)) s2 := mapset.NewSet(1, 3, 4, 5) // 并集 fmt.Println(s1.Union(s2)) }
Das Ergebnis ist:
s1 contains 3: true s1 contains 5: false s1 contains poloxue: true s1 contains 3: false Set{1, 2, 4, poloxue, 3, 5}
Empfohlenes Lernen: Golang-Tutorial
Das obige ist der detaillierte Inhalt vonVerfügt die Go-Sprache über eine festgelegte Sammlung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!