Je souhaite créer un type de données comme une pile. Je souhaite ajouter et supprimer des entrées "en haut" et pouvoir les imprimer. Dans cet exemple, le type XPath est utilisé pour parcourir le document XML et garder une trace du chemin actuel.
J'ai donc créé un type xpath[]string et écrit les fonctions correspondantes, à savoir : push() pop() et string().
Mon problème est que le type perd son état, ce qui me déroute un peu car je pensais que les tranches étaient des types de référence. De plus, si j'essaie de changer la fonction en récepteur de pointeur, j'obtiens plusieurs erreurs de compilation. Pour résoudre ce problème à ce stade, je viens de changer la chaîne [] en une structure avec un seul champ de chaîne []. Bien que cela me dérange toujours de ne pas pouvoir le faire fonctionner en utilisant uniquement slice comme type de base.
Quelle est la bonne approche ?
package main import ( "fmt" "strings" ) type xPath []string func (xp xPath) push(entry string) { xp = append(xp, entry) } func (xp xPath) String() string { sb := strings.Builder{} sb.WriteString("/") sb.WriteString(strings.Join(xp, "/")) return sb.String() } func main() { xp := xPath{} xp.push("rss") xp.push("channel") xp.push("items") fmt.Println(xp) // Output: / // Wanted: /rss/channel/items }
Votre fonction push ne fait rien.
Fonctionnalité push correcte :
func (xp *xPath) push(entry string) { *xp = append(*xp, entry) }
Une tranche est un type de référence dans les situations où vous souhaitez modifier sa valeur (par exemple en utilisant un index).
En revanche, si vous souhaitez les réaffecter et remplacer la tranche entière, vous devez utiliser des pointeurs.
Concernant les stacks, il existe de meilleures méthodes : Découvrez cette question.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!