J'implémente un arbre dans Go. Ma structure TreeNode ressemble à ceci:
func createEmptyTree(fileName string) *TreeNode{
return &TreeNode{
nil, // Line #180
nil,
false,
map[byte]*TreeNode{},
}
}
Dans mon implémentation, le nœud racine de l'arbre est un nœud spécial qui n'a pas de charge utile. Sinon, la charge utile est toujours une seule lettre minuscule de l'alphabet anglais. Donc, ma fonction d'initialisation d'arbre ressemble à ceci:
type TreeNode struct {
payload byte
parent *TreeNode
children map[byte]*TreeNode
}
Quand je le compile cependant, j'obtiens l'erreur suivante: ./main.go:180:9: impossible utilisez nil comme octet de type dans la valeur du champ
Il semble donc que je ne puisse pas utiliser nil pour une variable d'octet. Y a-t-il autre chose que je pourrais utiliser dans cette situation? Je pourrais facilement utiliser '0' ou tout autre caractère non alphabétique. Mais cela semble piraté. Que dois-je faire?
3 Réponses :
Chaque type de golang a une valeur nulle. Dans le cas de byte , c'est l'octet nul.
Il est tout à fait possible d'utiliser simplement l'octet nul comme charge utile zéro magique à la racine.
Vous avez la valeur zéro confondue avec une tranche d'octet. La valeur zéro pour une tranche est nil . Pour un octet , qui est un alias pour uint8 , son 0 .
byte est un type numérique , en fait un alias pour < code> uint8 .
Cela signifie qu'il a une valeur zéro par défaut de 0.
Pour un Go idiomatique, écrivez votre fonction comme suit:
&{0 <nil> map[]}
Playground: https://play.golang.org/p/v6DJCnpN6Ys
Output:
package main
import (
"fmt"
)
type TreeNode struct {
payload byte
parent *TreeNode
children map[byte]*TreeNode
}
func createEmptyTree(fileName string) *TreeNode {
return &TreeNode{
children: map[byte]*TreeNode{},
}
}
func main() {
tree := createEmptyTree("fiename")
fmt.Println(tree)
}
Le payload code > la valeur pour un arbre vide est un entier zéro ( 0 ), la valeur zéro pour le type entier byte . Zéro n'est pas une valeur de lettre minuscule unique de l'alphabet anglais.
La spécification du langage de programmation Go
Lorsque le stockage est alloué pour une variable, soit via une déclaration ou un appel de nouveau, ou lorsqu'une nouvelle valeur est créée, soit par un littéral composite ou un appel de make, et aucune initialisation explicite n'est fourni, la variable ou la valeur reçoit une valeur par défaut. Chaque élément d'une telle variable ou valeur est définie sur la valeur zéro pour son type: false pour les booléens, 0 pour les types numériques, "" pour les chaînes et nil pour pointeurs, fonctions, interfaces, tranches, canaux et cartes.