Как стать автором
Обновить

Кастование произвольного слайса, к слайсу интерфейсов

Время на прочтение1 мин
Количество просмотров2.8K

Всем привет. У каждого, кто знаком с Go был вопрос, а какого лешего я не могу сделать вот так вот:


var  a = []int{1,2,3}
b = []interface(a)

Почему приходится писать вот так:


b := make([]interface{}, len(a))
for i:=0; i<len(a); i++ {
   b[i] = a[i]
}

Но, можно и по другому....


Я решил немного размяться и найти способ сделать это быстрее и удобнее. Получилось.


Подробности здесь.


Если коротко, то благодаря пакету unsafe удалось заменить создание слайса интерфейсов и копирование данных, созданием слайса интерфейсов с len и cap оригинального слайса и копирование указателей. Благодаря особенностям реализации интерфейсов, получился, в нагрзуку, бесплатный (но не полноценный) механизм COW (copy-on-write): пока вы не изменяете данные в итоговом слайсе данные в исходном и результирующем слайсе лежат в одном месте, но при изменении элементов результирующего слайса этот элемент уже не будет указывать на исходный. В обратном порядке, к сожалению, это не работает.


Немножко о производительности:


Эффективность решения напрямую зависит от размера элементов слайса и длинны слайса, чем больше длинна слайса и "вес" элемента — тем эффективнее


https://gist.github.com/t0pep0/af41fba259eb4d3d00d2e7efa0e4093a

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 23: ↑10 и ↓13-3
Комментарии5

Публикации

Истории

Работа

Go разработчик
138 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
11 сентября
Митап по BigData от Честного ЗНАКа
Санкт-ПетербургОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн