Есть ли нулевое значение, которое я могу использовать для байтов в Go? - PullRequest
0 голосов
/ 01 января 2019

Я реализую дерево в Go.Моя структура TreeNode выглядит следующим образом:

type TreeNode struct {
    payload byte
    parent *TreeNode
    children map[byte]*TreeNode
}

В моей реализации корневой узел дерева - это специальный узел без полезной нагрузки.В противном случае полезная нагрузка всегда представляет собой одну строчную букву из английского алфавита.Итак, моя функция инициализации дерева выглядит следующим образом:

func createEmptyTree(fileName string) *TreeNode{
    return &TreeNode{
        nil,           // Line #180
        nil,
        false,
        map[byte]*TreeNode{},
    }
}

Когда я ее компилирую, я получаю следующую ошибку: ./main.go:180:9: cannot use nil as type byte in field value

Так что, похоже, я не могу использовать nil длябайтовая переменная.Есть ли что-то еще, что я мог бы использовать в этой ситуации?Я мог легко использовать '0' или другой не алфавитный символ.Но это кажется хакерским.Что мне делать?

Ответы [ 3 ]

0 голосов
/ 01 января 2019

byte - это числовой тип , фактически псевдоним для uint8.

Это означает, что по умолчанию нулевое значение равно 0.

0 голосов
/ 01 января 2019

Для idiomatic Go напишите свою функцию как:

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

Детская площадка: https://play.golang.org/p/v6DJCnpN6Ys

Выход:

&{0 <nil> map[]}

Значение payload дляпустое дерево - это целое число ноль (0), нулевое значение для целочисленного типа byte.Ноль - это не одна строчная буква из английского алфавита.


Спецификация языка программирования Go

Нулевое значение

Когда память выделена дляпеременная, либо через объявление или вызов new, либо при создании нового значения, либо через составной литерал, либо через вызов make, и явная инициализация не предоставляется, переменной или значению присваивается значение по умолчанию.Для каждого элемента такой переменной или значения устанавливается нулевое значение для его типа: false для логических значений, 0 для числовых типов, «» для строк и nil для указателей, функций, интерфейсов, слайсов, каналов и карт.

0 голосов
/ 01 января 2019

Каждый тип в golang имеет нулевое значение.В случае byte это нулевой байт.

Вполне возможно просто использовать нулевой байт в качестве магического нулевого содержимого в корне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...