Heim >Backend-Entwicklung >Golang >Verfügt die Go-Sprache über eine festgelegte Sammlung?

Verfügt die Go-Sprache über eine festgelegte Sammlung?

青灯夜游
青灯夜游Original
2021-06-04 12:05:166115Durchsuche

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.

Verfügt die Go-Sprache über eine festgelegte Sammlung?

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!

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