Любая разница в использовании пустого интерфейса или пустой структуры в качестве значения карты в golang

Я использую эту конструкцию для моделирования набора

type MyType uint8
map[MyType]interface{}

Затем я добавляю все мои ключи и сопоставляю их с nil.

Я узнал, что также можно использовать

map[MyType]struct{}

Любые преимущества использования пустой структуры по сравнению с interface{}.

Ответы

Ответ 1

Использование памяти. Например, типы struct{}, interface{} и bool,

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var s struct{}
    fmt.Println(unsafe.Sizeof(s))
    var i interface{}
    fmt.Println(unsafe.Sizeof(i))
    var b bool
    fmt.Println(unsafe.Sizeof(b))
}

Выход (байты для 32-разрядной архитектуры):

0
8
1

Выход (байты для 64-битной архитектуры):

0
16
1

Литература:

Go Data Structures: Интерфейсы

Ответ 2

Пустые структурные и пустые интерфейсы, хотя и синтаксически похожие, на самом деле являются противоположностями. Пустая структура содержит данные no; пустой интерфейс может содержать любые данные. Если я вижу map[MyType]struct{}, я сразу знаю, что никакие значения не будут сохранены, только ключи. Если я увижу map[MyType]interface{}, мое первое впечатление будет заключаться в том, что это гетерогенная коллекция ценностей. Даже если я вижу код, хранящий в нем нуль, я не буду точно знать, что какой-то другой фрагмент кода не хранит в нем что-то еще.

Другими словами, использование struct{} делает ваш код более читаемым. Он также сохраняет небольшую память, как описано в другом ответе, но это всего лишь преимущество использования правильного инструмента для работы.