Всем привет. У всех, кто знаком с 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 Теги: #Go #интерфейс #slice #Ненормальное программирование #Go
-
Как Правильно Продать/Купить Домен
19 Oct, 24 -
Exchange Management Shell: Возможно Все!
19 Oct, 24 -
Пятая Информационная Революция - Продолжение
19 Oct, 24 -
Подход К Работе
19 Oct, 24