Неудобство с увеличением ёмкости среза

108 views
Skip to first unread message

itcraft...@gmail.com

unread,
Nov 7, 2013, 6:58:51 AM11/7/13
to gola...@googlegroups.com
Часто необходимо увеличить ёмкость среза и приходится писать

newparts = make([]t_item, len(parts)*2)
copy(newparts, parts)
parts = newparts

хорошо бы была универсальная функция для увеличения ёмкости срезов любого типа

возможно ли на основе отражения как то определить тип и создать новую переменную с этим типом ?
http://play.golang.org/p/JYwarH_R5l

Alexey Palazhchenko

unread,
Nov 7, 2013, 7:03:13 AM11/7/13
to gola...@googlegroups.com
Привет,
Можно через reflect.SliceOf и reflect.New.

Но насчёт «хорошо бы» – не уверен. Для примера выше append() не подойдёт?

–-–
Алексей "AlekSi" Палажченко

itcraft...@gmail.com

unread,
Nov 7, 2013, 7:10:14 AM11/7/13
to gola...@googlegroups.com
Привет,

Почему не уверен? через отражение будет медленно?
append добавляет уже существующий срез
был бы resize

Alexey Palazhchenko

unread,
Nov 7, 2013, 7:19:56 AM11/7/13
to gola...@googlegroups.com
> append добавляет уже существующий срез

Только если в существующем достаточно capacity.

> был бы resize

Если capacity не хватает, append() выделяет память под новый массив, копирует данные и возвращает новый слайс – ровно то, что делает твой код.

> Почему не уверен? через отражение будет медленно?

Медленней. Можно сделать бенчмарк, я ставлю на замедление на порядок-два.

Но главное – зачем? append'а хватает почти всегда.

–-–
Алексей "AlekSi" Палажченко

Reply all
Reply to author
Forward
0 new messages