Wie kann man in Go so etwas wie eine Liste von void * (oder Variantentypen) erreichen?

Ich bin ein Go-Anfänger, der Golang seit ungefähr 3 Tagen studiert (obwohl es noch neu ist). Mit Lua konnten Sie einer Tabelle verschiedene Datentypen hinzufügen, aber was ist mit Go? Nach dem Studium von Go habe ich einige Nachforschungen angestellt, aber ich konnte die Antwort nicht finden, deshalb schreibe ich sie hier.

Variantentyp in Go

Nach vielen Recherchen scheint es, dass der Variantentyp in Go die Schnittstelle {} sein sollte. Ich bin der Seite "Beeilen Sie sich, um die Go lang # 6-Benutzeroberfläche zu lernen" dankbar, die auf sehr leicht verständliche Weise erklärt wird.

damit,

variant.go


var s interface{}
s=1.23
fmt.Printf("s=%f\n",s.(float64))
s="hello"
fmt.Printf("s=%s\n",s.(string))

Und wenn Sie es ausführen,

resut-variant.txt


s=1.230000
s=hello

Und Sie können bestätigen, dass Sie mit Sicherheit alles ersetzen können.

Liste der Variantentypen in Go

In Go werden Arrays mit variabler Länge als Slices bezeichnet. Wenn ein Typ durch den Buchstaben T dargestellt wird, ist der Slice-Typ von T [] T. Es scheint also, dass der Slice-Typ, der jeden Typ speichern kann, als var list \ [] interface \ {} geschrieben werden sollte. In der Tat scheint es zu funktionieren.

variant-slice.go


var list []interface{}
list=append(list,10)
fmt.Printf("list[0]=%d\n",list[0].(int))

Erweitert: Erstellen Sie einen Stapel, der alles pushen und platzen kann

Deshalb ist es eine erweiterte Version. Definieren Sie einen Stapeltyp und versuchen Sie, verschiedene Datentypen zu verschieben und zu löschen.

Erstens ist die Definition des Stapels. Pop gibt zwei Werte zurück, wobei der zweite Rückgabewert angibt, ob er erfolgreich (= true) oder bei leerem Stapel (= false) gelöscht wurde.

stack.go


package main

type Stack struct {
    index int
    dataBody []interface{}
}

func (self *Stack) Push(inData interface{}) {
    self.index++
    self.dataBody=append(self.dataBody,inData)
}

func (self *Stack) Pop() (interface{},bool) {
    if self.index<=0 {
        return nil,false
    }
    var ret interface{}
    ret,self.dataBody=self.dataBody[len(self.dataBody)-1],
                      self.dataBody[:len(self.dataBody)-1]
    self.index--
    return ret,true
}

Für den Pop aus dem Slice habe ich auf den Pop aus "SliceTricks" verwiesen (oder besser gesagt, so wie er ist ...).

Als nächstes kommt das Testprogramm.

test-stack.go


package main

import "fmt"

var DS Stack

func main() {
    DS.Push(10)
    DS.Push("aaa")
    t,_:=DS.Pop()
    fmt.Printf("%s\n",t.(string))
    t,_=DS.Pop()
    fmt.Printf("%d\n",t.(int))
    t,ok:=DS.Pop()
    if ok {
        fmt.Println("OK")
    } else {
        fmt.Println("Data stack is empty")
    }
}

Wenn ich es laufen lasse,

result-test-stack.txt


aaa
10
Data stack is empty

Zeigt an, dass Ganzzahlen und Zeichenfolgen auf denselben Stapel verschoben und abgelegt werden können.

Zusammenfassung

Wir haben festgestellt, dass Variantentypen in go durch die Nutzung einer leeren Schnittstelle erreicht werden können und dass Slices auch durch normales Schreiben erreicht werden können. Wenn Sie einen Stapel mit Multithreading oder Goroutine teilen möchten, müssen Sie möglicherweise mit Mutex sperren / entsperren, aber die allgemeine Weisheit in C oder C # funktioniert möglicherweise nicht. Ich würde gerne viel darüber lernen.

Recommended Posts

Wie kann man in Go so etwas wie eine Liste von void * (oder Variantentypen) erreichen?
So formatieren Sie eine Liste von Wörterbüchern (oder Instanzen) in Python
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
[Python] So fügen Sie eine beliebige Anzahl von Standardeingaben in die Liste ein
So löschen Sie einen Taple in einer Liste (Python)
[Go] So schreiben oder rufen Sie eine Funktion auf
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
So überprüfen Sie in Python, ob sich eines der Elemente einer Liste in einer anderen Liste befindet
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
So mischen Sie einen Teil der Python-Liste (at random.shuffle)
So importieren Sie Dateien in Python an eine beliebige Stelle
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
So zeigen Sie eine Liste der mit pyenv installierbaren Versionen an
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So erhalten Sie eine Liste mit Links von einer Seite aus Wikipedia
So verbinden Sie den Inhalt der Liste mit einer Zeichenfolge
[Python] So löschen Sie eine Zeile / Spalte in einer Tabelle (Liste der Optionen für die Drop-Methode)
Eine Geschichte, die ich machen wollte, als ich eine Liste von Lernsitzungen mit Python bekam
Übergeben des Ausführungsergebnisses eines Shell-Befehls in einer Liste in Python (nicht blockierende Version)
So zeigen Sie eine bestimmte Dateispalte unter Linux an (awk)
So bestimmen Sie die Existenz eines Selenelements in Python
[Python] So erzwingen Sie, dass eine Methode einer Unterklasse einen bestimmten Prozess ausführt
So vergleichen Sie Listen und rufen allgemeine Elemente in einer Liste ab
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
So überprüfen Sie die Speichergröße einer Variablen in Python
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
So löschen Sie mehrere angegebene Positionen (Indizes) in einer Python-Liste
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
Zeigen Sie eine Liste der Alphabete in Python 3 an
So senden Sie ein visualisiertes Bild der in Python erstellten Daten an Typetalk
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Wie bekomme ich Stacktrace in Python?
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Zusammenfassung der Verwendung der Python-Liste
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Konvertieren Sie das PDF der Go To EAT-Mitgliedergeschäftsliste in der Präfektur Niigata in CSV
Ein Memorandum zur Ausführung des Befehls! Sudo magic in Jupyter Notebook
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Was gefällt Ihnen an der Konvertierung eines Arrays (einer Liste) in einen String?
So verfolgen Sie die Arbeit mit Powershell
Einbetten von Variablen in Python-Strings
Zusammenfassung zum Importieren von Dateien in Python 3
So erstellen Sie eine JSON-Datei in Python
Kopieren Sie die Liste in Python
Zusammenfassung der Verwendung von MNIST mit Python
So implementieren Sie eine Verlaufsauswahl in Houdini
So benachrichtigen Sie Discord-Kanäle in Python
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
So erstellen Sie eine Rest-API in Django