Inhaltsverzeichnis
Frageninhalt
Problemumgehung
Heim Backend-Entwicklung Golang Der effizienteste Weg, eindeutige Kartenschlüssel in Go zu erstellen

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

Feb 11, 2024 pm 05:06 PM
go语言 Standardbibliothek

在 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>
Nach dem Login kopieren

Drucken

key1 == key2 true
key3 == key4 false
key5 == key6 true
func12 true
func34 true
func56 true
Nach dem Login kopieren

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
)
Nach dem Login kopieren

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!

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

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

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Apr 03, 2025 pm 03:00 PM

Multithreading in der Sprache kann die Programmeffizienz erheblich verbessern. Es gibt vier Hauptmethoden, um Multithreading in C -Sprache zu implementieren: Erstellen Sie unabhängige Prozesse: Erstellen Sie mehrere unabhängig laufende Prozesse. Jeder Prozess hat seinen eigenen Speicherplatz. Pseudo-MultitHhreading: Erstellen Sie mehrere Ausführungsströme in einem Prozess, der denselben Speicherplatz freigibt und abwechselnd ausführt. Multi-Thread-Bibliothek: Verwenden Sie Multi-Thread-Bibliotheken wie PThreads, um Threads zu erstellen und zu verwalten, wodurch reichhaltige Funktionen der Thread-Betriebsfunktionen bereitgestellt werden. Coroutine: Eine leichte Multi-Thread-Implementierung, die Aufgaben in kleine Unteraufgaben unterteilt und sie wiederum ausführt.

Was wird in der C -Sprache allgemein verwendet? Was wird in der C -Sprache allgemein verwendet? Apr 03, 2025 pm 02:39 PM

Es gibt keine Funktion mit dem Namen "Sum" in der C -Sprachstandard -Bibliothek. "Summe" wird normalerweise von Programmierern definiert oder in bestimmten Bibliotheken bereitgestellt, und seine Funktionalität hängt von der spezifischen Implementierung ab. Gemeinsame Szenarien sind für Arrays summiert und können auch in anderen Datenstrukturen verwendet werden, z. B. in verknüpften Listen. Zusätzlich wird "Summe" auch in Bereichen wie Bildverarbeitung und statistischer Analyse verwendet. Eine ausgezeichnete "Summe" -Funktion sollte eine gute Lesbarkeit, Robustheit und Effizienz haben.

Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Apr 02, 2025 pm 02:03 PM

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Apr 02, 2025 pm 12:57 PM

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Apr 02, 2025 pm 05:09 PM

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

See all articles