Heim  >  Artikel  >  Backend-Entwicklung  >  Der effizienteste Weg, eindeutige Kartenschlüssel in Go zu erstellen

Der effizienteste Weg, eindeutige Kartenschlüssel in Go zu erstellen

WBOY
WBOYnach vorne
2024-02-11 17:06:10497Durchsuche

在 Go 中创建唯一映射键的最有效方法

In der Go-Sprache war die effizienteste Möglichkeit zur Erstellung eindeutiger Zuordnungsschlüssel schon immer ein Anliegen für Entwickler. In Situationen, in denen Schlüssel eindeutig sein müssen, müssen wir eine effiziente und zuverlässige Methode finden. Der PHP-Editor Baicao stellt in diesem Artikel eine der effektivsten Methoden vor, mit denen Sie eindeutige Zuordnungsschlüssel in der Go-Sprache erstellen und so Ihren Code optimierter und effizienter gestalten können. Unabhängig davon, ob Sie große Datenmengen verarbeiten oder hochgradig gleichzeitige Anwendungen implementieren, können diese Methoden Ihnen dabei helfen, Leistung und Effizienz zu verbessern. Finden wir es gemeinsam heraus!

Frageninhalt

Ich habe einen map[any]SomeType irgendwo in der Bibliothek. Ich möchte, dass Bibliotheksbenutzer Schlüssel für diese Karte erstellen können, damit es garantiert nicht zu Konflikten innerhalb einer einzelnen Anwendungsausführung kommt, und ich möchte, dass diese Schlüssel für die Kartensuche effizient sind.

Das erste, was mir in den Sinn kommt, ist die Verwendung der Speicheradresse eines eindeutigen leeren Objekts. Aber alles, was ich bisher versucht habe, ist fehlgeschlagen:

<code>package main

import "fmt"

var key1 = &struct{}{}
var key2 = &struct{}{}

var key3 = struct{}{}
var key4 = struct{}{}

var key5 = new(struct{})
var key6 = new(struct{})

func main() {
    fmt.Println("key1 == key2", key1 == key2)
    fmt.Println("key3 == key4", &key3 == &key4)
    fmt.Println("key5 == key6", key5 == key6)
    test(key1, key2, "func12")
    test(&key3, &key4, "func34")
    test(key5, key6, "func56")
}

func test(a, b any, msg string) {
    fmt.Println(msg, a == b)
}
</code>

Drucken

key1 == key2 true
key3 == key4 false
key5 == key6 true
func12 true
func34 true
func56 true

Das Ermitteln der Adresse einer leeren Strukturvariablen ist also fast machbar, bis Sie sie an eine Funktion übergeben. Dann verschwindet der Unterschied.

Ich möchte keine Schlüsselregistrierung einführen, da dies eine unnötige Komplikation darstellt. Ich möchte auch keine Zeichenfolgen verwenden, da verschiedene Verbraucher der Bibliothek Schlüssel aushandeln oder Namespaces verwenden müssten und die Notwendigkeit, Zeichenfolgen zu hashen und zu vergleichen, ebenfalls eine unnötige Komplikation darstellt.

Gibt es Methoden, an die ich noch nicht gedacht habe?

Problemumgehung

Die Standardbibliothek verwendet den context.Context 时使用了一个“技巧”:上下文能够在其中携带任意值,并且这些值使用 interface{} 进行键控(从一段时间以来 any)1。然后,您自己的包可以为其将要使用的上下文键定义一个新的未导出类型,然后定义一组具有该类型的常量作为该包已知的上下文键。现在的技巧是,类型始终是 interface{}-Teil eines beliebigen Werttyps, daher ist es nicht möglich, Schnittstellenwerte zu erstellen, die mit den Schlüsseln des Pakets in Konflikt stehen.

Im Grunde ist es so:

package mypkg

type contextKey int

const (
  KeyFoo = contextKey(iota)
  KeyBar
)

Jetzt, wenn Sie key interface{} = KeyFoo 时,几乎可以保证程序中任何其他代码段都不能具有与 key 相同的值,因为其中一部分将(指向的内部指针)未导出输入 contextKey ausführen. Vielleicht möchten Sie diesen klassischen Artikel lesen, um zu verstehen, wie es funktioniert (etwas eingerostet, aber immer noch zu 99 % korrekt)).

Für mich sieht das nach einem Weg in die Zukunft aus: Benutzer Ihres Pakets können ihre eigenen Schlüssel generieren und diese an Ihre Karte senden, die den Schlüsseltyp interface{}any haben sollte. Für die Übergabe dieser Schlüssel ist keine zentrale Registrierungsstelle erforderlich.

1 Weitere Informationen finden Sie unter context.Context.Value() und context.WithValue(). Letzteres bietet weitere Tipps zur Generierung des Schlüssels.

Das obige ist der detaillierte Inhalt vonDer effizienteste Weg, eindeutige Kartenschlüssel in Go zu erstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen