Работа с битовыми масками в Go (перечисление Go с помощью йоты) - PullRequest
0 голосов
/ 23 января 2019

Бит застрял.

Я пытаюсь понять, как получить значения битовой маски из const с перечислением go. Например, если ключ равен 5, что составляет 0101 бит, это будет собака и рыба. Какой самый простой способ получить битовые значения (1,2,4,8,16, 32, 64 и т. Д.), Чтобы я мог выбрать строковые значения и вернуть набор животных?

type Key int

const (
    Dog Key = 1 << iota
    Cat
    Fish
    Horse
    Snake
    Rabbit
    Lion
    Rino
    Hedgehog
)

Читал, но я не могу понять это.

1 Ответ

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

Объявите фрагмент строк, где строки соответствуют именам констант:

var animalNames = []string{
    "Dog",
    "Cat",
    "Fish",
    "Horse",
    "Snake",
    "Rabbit",
    "Lion",
    "Rino",
    "Hedgehog",
}

Чтобы получить имена для битов, выполните циклический перебор имен.Если установлен соответствующий бит, добавьте имя к результату:

func Names(k Key) []string {
    var result []string
    for i := 0; i < len(animalNames); i++ {
        if k&(1<<uint(i)) != 0 {
            result = append(result, animalNames[i])
        }
    }
    return result
}

Запустите его на игровой площадке .

Если вы измените константы на битыиндексы вместо битовых значений, тогда вы можете использовать утилиту stringer для создания func (k Key) String() string.Вот код для этого изменения:

type Key uint

const (
    Dog Key = iota
    Cat
    Fish
    Horse
    Snake
    Rabbit
    Lion
    Rino
    Hedgehog
)

//go:generate stringer -type=Key

func Names(k Key) []string {
    var result []string
    for animal := Dog; animal <= Hedgehog; animal++ {
        if k&(1<<animal) != 0 {
            result = append(result, animal.String())
        }
    }
    return result
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...