Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199

Начинающим Гошникам. Особенность []string как типа данных

13.09.2021, 14:13. Показов 1333. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем вот такой примерчик
Go
1
2
3
4
5
6
7
8
9
10
func DoSomesing( arr ...interface{}) {
    fmt.Println(fmt.Sprintf("%#v", arr))
}
 
func myMain(){
 
  var myStringArray = []string{"a","b","c"}
  DoSomesing( myStringArray...)              // п.1. тут будет ошибка времени компиляции!
  DoSomesing( myStringArray)                // п.2. тут будет правильное но не ожиданное поведение
}
Неожиданно падает на этапе компиляции в п.1. Казалось бы "в чем дело?" .. как выяснилось - "старая шутка разработчиков". Похоже массив строк не есть "множественный тип данных" или "развернуть" его вставкой соответствующего цикла в набор параметров, оказалось не комильфо. А понять что конструкция ...interface{} есть по сути "слайс чего угодно" и передавать в него массив строк как есть .. оказалось не по силам авторам компилятора..

В целом, проблема не стоит выеденного яйца, если бы Го реализовывал все свои заморочки полноценно, т.е. если указано явное раскрытие массива, то оно и должно исполняться: в функцию должно передаваться то кол-во аргументов, которое соответствует емкости этого массива. А вот ПОТОМ, уже можно применить обратное действие, заявленное типом функции, а именно: раз указано переменное кол-во параметров типа интерфейс, то каждый аргумент д.б. преобразован в интерфейс и все это свернуто в слайс интерфейсов и передано в функцию

Далее дело оптимизатора выкинуть преобразование туда-сюда-обратно как избыточное.

В общем, разворачивать ... можно только тот тип, который присутствует в описании функции как ...interface{}

Кстати, ровно те же самые проблемы возникают во многих местах, где можно было бы использовать []interface{} как указание на "слайс чего угодно".. но, никак.


https://stackoverflow.com/ques... -interface типичный пример наступания на эту граблю.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.09.2021, 14:13
Ответы с готовыми решениями:

Как из типа данных string перевести в int?
р=input("введите число:") try: p=int(p)#как такое сделать в C++ except: print("введите число!!!") Как в С++ из одного...

Как перейти от типа данных string к char?
Подскажите пожалуйста,как можно данный участок кода реализовать, не используя string?(n-число,которое переводится из десятичной с-ты...

Как сравнить значение переменной типа String с данными в базе данных?
Допустим, у меня есть String str = "test";, можно ли как-то сравнить его с данными в базе данных

2
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
13.09.2021, 17:03
Arhat109, ты просто понятия не имеешь, как устроены интерфейсы в Go. И строки тут не причём, так же будет с любым другим типом, например, массивом int'ов.
1
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
13.09.2021, 22:47  [ТС]
Цитата Сообщение от Arhat109 Посмотреть сообщение
В общем, разворачивать ... можно только тот тип, который присутствует в описании функции как ...interface{}
Цитирую себя, специально для КЭП Очевидность. Именно, что разворачивать тремя точками можно только тот тип, что присутствует за таковыми в обьявлении параметра.

Добавлено через 18 минут
На самом деле, косяк вызывается вот этими строчками из спецификации языка:

If the final argument is assignable to a slice type []T and is followed by ..., it is passed unchanged as the value for a ...T parameter. In this case no new slice is created.

В сочетании с описанием выше:

If f is variadic with a final parameter p of type ...T, then within f the type of p is equivalent to type []T. If f is invoked with no actual arguments for p, the value passed to p is nil. Otherwise, the value passed is a new slice of type []T with a new underlying array whose successive elements are the actual arguments, which all must be assignable to T.


Что с одной стороны, сначала "разжевывает", что variadic сворачивается в слайс для передачи, а с другой стороны указывает что постфиксное применение троеточия при вызове .. является просто "специальной фичей", а вовсе не обратным действием - "разворачиванием массива в набор аргументов".

Сие сильно НЕ очевидно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.09.2021, 22:47
Помогаю со студенческими работами здесь

Как совместить строку типа String, имеющуюся в коде и функцию, принимающую std::string ?
Доброго времен суток)) У меня такая проблема: есть строка типа String^ , а функция принимает string. Не знаю как их...

Дан массив типа Object. Состоящий из 15 элементов, 5 из них типа Integer, 5 типа String и 5 типа Double
Разделить массив типа Object на 3 массива по типам данных. Числовые массивы отсортировать в порядке убывания. ...

Присвоение объекту типа string рандомный элемент из массива типа string
Добрый вечер, дорогие форумчане. Я столкнулся с проблемой. Как присвоить объекту типа string рандомный элемент из массива типа string? ...

Как сравнить переменную типа String с переменной типа Int?
Как сравнить переменную типа String с переменной типа Int в конструкции "if"???

Как в двумерном массиве типа int задать конкретный элемент типа string
Подскажите пожалуйста, мне нужен массив чисел размерностью 12 на 2. Но при этом мне нужно обозвать первую колонку например...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru