Можно ли полю структуры объявить тип "срез" с размером массива?

37 views
Skip to first unread message

Александр Рем

unread,
Jul 2, 2019, 9:21:19 AM7/2/19
to Golang Russian
Вот предположим с массивом всё ясно

type Strct struct {
    items
[15]int
}
//срез нулевой длины тоже понятно как указать

type Strct struct {
    items
[]int
}

А можно ли в том же ключе указать срез, но с предустановленной длинной массива под ним?
Смысл в том, что срез нулевой длины - не эффективно, и вто же время как-то не хочется писать функцию  NewStrct() ради инициализации такой фигни

Alex Lurye

unread,
Jul 2, 2019, 9:39:06 AM7/2/19
to Golang Russian
Нет, так сделать нельзя. Вам нужна или NewStrct, или изменить семантику значения items, чтобы пустой слайс был разрешённым и осмысленным значением по умолчанию. 

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/a7ce72d7-0c7d-447b-be49-8225aeb41c75%40googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Александр Рем

unread,
Jul 3, 2019, 2:58:48 AM7/3/19
to Golang Russian
Ясно.
Я в принципе с утра уже подумал в сторону того что бы обойти это через доп. метод с ленивой инициализацией.
Видимо так и сделаю.

Использование функции New* мне сильно не нравится... Хотя кто я такой, что бы брюзжать ) но тем не менее: Т.к. легко создать структуру безо всякого "New", это источник потенциальных, сложно уловимых проблем.
По уму надо было либо все структуры создавать строго через "new" либо (что лучше) допустить определение значений по умолчанию прямо в описании структуры (непонятно зачем это не сделано и на кой ляд поля структуры имеют свой способ описания отличный от описания переменных).

Ну да надо юзать то, что есть )

вторник, 2 июля 2019 г., 16:39:06 UTC+3 пользователь Alex Lurye написал:
Нет, так сделать нельзя. Вам нужна или NewStrct, или изменить семантику значения items, чтобы пустой слайс был разрешённым и осмысленным значением по умолчанию. 

On Tue, Jul 2, 2019 at 3:21 PM Александр Рем <gen...@live.ru> wrote:
Вот предположим с массивом всё ясно

type Strct struct {
    items
[15]int
}
//срез нулевой длины тоже понятно как указать

type Strct struct {
    items
[]int
}

А можно ли в том же ключе указать срез, но с предустановленной длинной массива под ним?
Смысл в том, что срез нулевой длины - не эффективно, и вто же время как-то не хочется писать функцию  NewStrct() ради инициализации такой фигни

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес gola...@googlegroups.com.

Alex Lurye

unread,
Jul 3, 2019, 3:47:19 AM7/3/19
to Golang Russian
Напишите предложение в багтрекер Go - https://github.com/golang/go/issues. Команда очень отзывчивая и либо добавит заявку в бэклог, или объяснят, чем это будет плохо.

С ходу, что приходит в голову - тривиальное объявление массива (var array [100000]element) может внезапно стать вычислительно дорогой операцией, т.к. уже не достаточно заполнить нулями кусок памяти, а надо перебирать все элементы и вызывать инициализирующий код для каждого элемента, который возможно приведёт к аллокации памяти в куче (в случае инициализации слайса новым массивом), рекурсивной инициализации каждого из полей и т.д.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/620790c3-8427-4e91-b931-eb18c9ea94e5%40googlegroups.com.

Degtyarev Evgeny

unread,
Jul 3, 2019, 3:57:43 AM7/3/19
to Golang Russian

Смысл в том, что срез нулевой длины - не эффективно, и вто же время как-то не хочется писать функцию  NewStrct() ради инициализации такой фигни

вам шашечки или ехать )

если хочется эффективно стоит посмотреть на sync.Pool, чтобы свести алокации к минимуму
Reply all
Reply to author
Forward
0 new messages