Comment réaliser quelque chose comme une liste de void * (ou de type de variante) dans Go?

Je suis un débutant en Go qui étudie le Golang depuis environ 3 jours (bien que ce soit encore nouveau). Lua vous a permis d'ajouter différents types de données à une table, mais qu'en est-il de Go? Après avoir étudié le Go, j'ai fait des recherches, mais je n'ai pas trouvé de réponse, je vais donc l'écrire ici.

Type de variante dans Go

Après de nombreuses recherches, il semble que le type de variante dans Go devrait être interface {}. Je suis reconnaissant à la page "Dépêchez-vous d'apprendre l'interface Go lang # 6" qui explique d'une manière très facile à comprendre.

alors,

variant.go


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

Si vous écrivez et exécutez,

resut-variant.txt


s=1.230000
s=hello

Et vous pouvez confirmer que vous pouvez certainement remplacer n'importe quoi.

Liste des types de variantes dans Go

Dans Go, les tableaux de longueur variable sont appelés tranches. Lorsqu'un type est représenté par la lettre T, le type de tranche de T est [] T. Ainsi, il semble que le type de tranche qui peut stocker n'importe quel type devrait être écrit comme var list \ [] interface \ {}. En fait, cela semble fonctionner.

variant-slice.go


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

Avancé: créez une pile qui peut pousser et faire sauter n'importe quoi

C'est pourquoi c'est une version avancée. Définissez un type de pile et essayez de pousser et de faire apparaître divers types de données.

La première est la définition de la pile. Pop renvoie deux valeurs de sorte que la deuxième valeur de retour indique si Pop a réussi (= true) ou si la pile était vide mais Popped (= false).

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
}

Pour le Pop de la tranche, j'ai fait référence au Pop de "SliceTricks" (ou plutôt, tel quel ...).

Vient ensuite le programme de test.

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")
    }
}

Quand je l'exécute,

result-test-stack.txt


aaa
10
Data stack is empty

Montre que les entiers et les chaînes peuvent être poussés et placés sur la même pile.

Résumé

Nous avons constaté que le type de variante dans go peut être obtenu en utilisant une interface vide, et que la tranche peut également être obtenue en l'écrivant normalement. Si vous souhaitez partager une pile avec multithreading ou goroutine, vous devrez peut-être verrouiller / déverrouiller avec mutex, mais la sagesse commune en C ou C # peut ne pas fonctionner, alors c'est à peu près tout. J'aimerais beaucoup étudier.

Recommended Posts

Comment réaliser quelque chose comme une liste de void * (ou de type de variante) dans Go?
Comment bien formater une liste de dictionnaires (ou d'instances) en Python
Comment obtenir une liste d'exceptions intégrées pour python
[Python] Comment mettre n'importe quel nombre d'entrées standard dans la liste
Comment effacer un taple dans une liste (Python)
[Go] Comment écrire ou appeler une fonction
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment obtenir une liste de fichiers dans le même répertoire avec python
Comment écrire un type liste / dictionnaire de Python3
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment mélanger une partie de la liste Python (au hasard.shuffle)
Comment importer des fichiers où vous le souhaitez en Python
Comment développer dans un environnement virtuel Python [Memo]
Comment afficher une liste des versions installables avec pyenv
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment obtenir une liste de liens à partir d'une page de wikipedia
Comment connecter le contenu de la liste dans une chaîne de caractères
[Python] Comment supprimer des lignes et des colonnes dans une table (liste des options de méthode de dépôt)
Une histoire que je voulais faire quand j'ai eu une liste de sessions d'étude avec Python
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python (version non bloquante)
Comment afficher une colonne de fichiers spécifiée sous Linux (awk)
Comment déterminer l'existence d'un élément sélénium en Python
[Python] Comment forcer une méthode d'une sous-classe à effectuer un processus spécifique
Comment comparer des listes et récupérer des éléments communs dans une liste
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Comment créer une grande quantité de données de test dans MySQL? ??
Créez une fonction pour obtenir le contenu de la base de données dans Go
Comment supprimer plusieurs positions (index) spécifiées dans une liste Python
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
Afficher une liste d'alphabets en Python 3
Comment envoyer une image visualisée des données créées en Python à Typetalk
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
Comment obtenir stacktrace en python
Je souhaite trier une liste dans l'ordre des autres listes
Résumé de l'utilisation de la liste Python
Comment mentionner un groupe d'utilisateurs avec une notification de mou, comment vérifier l'ID d'un groupe d'utilisateurs
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Convertir le PDF de la liste des magasins membres Go To EAT dans la préfecture de Niigata en CSV
Un mémorandum expliquant comment exécuter la commande magique! Sudo dans Jupyter Notebook
Je souhaite voir une liste de fichiers WebDAV dans le module Requêtes
Qu'est-ce que vous aimez dans la conversion d'un tableau (liste) en chaîne?
Comment suivre le travail avec Powershell
Comment incorporer des variables dans des chaînes python
Résumé de la façon d'importer des fichiers dans Python 3
Comment créer un fichier JSON en Python
Copiez la liste en Python
Résumé de l'utilisation de MNIST avec Python
Comment implémenter un sélecteur de dégradé dans Houdini
Comment notifier les canaux Discord en Python
[Python] Comment dessiner un histogramme avec Matplotlib
Comment créer une API Rest dans Django