Любая разница в использовании пустого интерфейса или пустой структуры в качестве значения карты в 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{}
делает ваш код более читаемым. Он также сохраняет небольшую память, как описано в другом ответе, но это всего лишь преимущество использования правильного инструмента для работы.