Приведение Произвольного Фрагмента К Фрагменту Интерфейсов

Всем привет. У всех, кто знаком с 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

Вместе с данным постом часто просматривают: