170 похожих чатов

Func testGen[T any](value T){ switch any(value).(type){

case string:
fmt.Println("Hello string: ", value)
case int:
fmt.Println("Hello int: ", value)
default:
panic("unknown type")
}
}
Глупый пример немного. Но лучшего варианта сейчас узнать какой тип? Его нет да?
То есть по сути дела, мы все еще должны выполнять проверку в рантайме.
И пока нет методов с дженериками. Свои какие то варинты типов мы тоже не можем толком делать.
Опять пытаюсь переписать свою либу.
Но так что бы уже избавится от постоянной прописи int32(value).
Сделать API более читаемый и простой.
В дженериках есть полезная ~.
Идея в том, что бы каждый числовой тип, более четко и с проверкой на ошибки конвертировал в int32.
Например если мы вышли за границы int32, потому что int64.
То мы сообщаем ошибку и выбираем поведение. Допустим в моем случае, кейсе. Даже в теории такое может быть редко.
И я бы вероятно сбрасывал значение на максимально большое в Int32.
Больших чисел практически нет. Но перестраховаться тоже надо.

С другой стороны, я вот думаю, а оно мне надо? Это так сказать не маленькая вещь.

Но мне очень нравится описание типов в духе rust и nim.
В rust краткость. i32,i64 ect.
В ним что то вроде strint.сstring
В go можно будет навелосипедеть.
i32.i64()
Иногда меня чуть чуть раздражает слишком большая простота Go.
В Си есть макросы и препроцессор...Можно и выкрутится где то.

Может у кого есть опыт? Типо делали свою надстройку над типами?
ДА и в целом. Стоит овчинка выделки или нет. По сути в реалиях std я раз по 10-20 конвертировал типы.
Возможно стоит 1 раз только при вызови API. Потому что основные функции которые общаются с Си.
Int32 и float32. И по сути любое объявление переменной это +-
newValue := int32(9)

17 ответов

4 просмотра

Вот обьясните насущную проблему необходимости определения типа?

Пока лучше нет, да. https://github.com/golang/go/issues/49206

Методов нет: https://github.com/golang/go/issues/49085

Alexey Palazhchenko
Методов нет: https://github.com/golang/go/issues/4...

В принципе, их можно сделать с помощью костылей, ввиде самописного Apply(структ, функ(структ), функ(структ)), и я даже делал, и оно type safe, но без -l=4, спавнит аллокации

Misha Borisov
В принципе, их можно сделать с помощью костылей, в...

Да проще ресивер первым аргументом передавать и всё

> T any а зачем там any?

Re- Автор вопроса
Dmitriy
Вот обьясните насущную проблему необходимости опре...

Я могу сказать только на примере своего проекта. И конкретно мои кейсы. 1. У меня есть функция Draw по сути спустя какое то время я пришел к выводу. Что мне часто надо рисовать числа и строки. strconv юзать по 10 раз. Мало дает удовольствия. Особенно в режиме прототипирования. Мы и раньше могли использовать интерфейсы, вопрос в том. Что вокруг них было построить что то, сложнее чем с дженериками. 2. Карта,где ключ интерфейс. число или строка. В моем проекте сейчас используется гофер луа. И по логике которая заложена в Lua мне надо парсить ключи где строка и число. Да если бы это была 1 карта. Я бы мог разделить их на 2. Но внутри таблицы, таблица и.т.д. 3. Увы в Go нет перезагрузки функций. По этому иногда очень хочется сделать интерфейс, пустой и пихать туда данные, а не плодить API. Я этого избегал. Но с джнериками, это проще поддерживать. Нам так же надо переключатся, потому что мы не знаем конкретный тип. 4. Как и был пример выше. Большинство C кода и библиотек это int32 и float32. В go хочется использовать 64 битную архитектуру. По этому A). Почти вся библиотека math это float64. Б). Почти все стандартные средства :=, функции и.т.д. Принимают по дефолту int (который int64) и float64. Следовательно ты постоянно конвертируешь данные. Что бы сделать что-то обобщенное. Надо интерфейс и свитчить типы. Опишу проблему на примере именно поддерживания всего. Когда ты можешь сделать тип, который может быть А или Б. Создать единую функцию. Твой код намного чище и проще потом это масштабировать. Когда у тебя постоянно что то конвертируется. В будущем ты постоянно что то дописываешь. Меняешь...читать сложнее. Это лично мой опыт на основе других ЯП, Где у меня почти дефолтный кейс создать ТИп который может быть str/int, int/float. И я потом не знаю боли. Сейчас я готов попробовать с Go. Навертеть на интерфейсах и посмотреть. Станет лучше или нет.

Re- Автор вопроса
c
> T any а зачем там any?

Все верно, он там не обязателен. Но в будущем я хочу использовать дженерики, пример не стал менять. Хотел узнать можем ли мы как то по другом свитчить типы или нет.

> Идея в том, что бы каждый числовой тип, более четко и с проверкой на ошибки конвертировал в int32. https://go.dev/play/p/RI9eFZ17Z0L?v=gotip

Re
Я могу сказать только на примере своего проекта. И...

У вас ключевая проблема не в коде, а в вашем отношение к языку. Вы хотите из него php/python/c++ все в одном. Нужно это понимать. Также нужно понимать, что это неверный подход в программирование в целом и в го в частности. Не надо из го делать пхп

я ничего не понял из описания проблемы при чем здесь система типов, дженерики и strconv?

Re- Автор вопроса
c
я ничего не понял из описания проблемы при чем зд...

Дженерики помогают удостоверится в типе или пропихнуть тип, на основе другого типа. Что уменьшает возможности выстрелить себе в ногу. Следовательно проще сделать свои кастомные типы. И забыть о тривиальных вещах. Например функцию которая принимает все числа или стринг. Вопрос что в этом деле опыта на Go мало.

Re
Я могу сказать только на примере своего проекта. И...

А не подойдет вариант, переделать все числа на type INumber interface { i32() int32 i64() int64 } и потом по ходу дела, звать конверторы, которые нужны?

или type Box[T any] struct { value T } type INumber interface { i32() Box[int32] i64() Box[int64] }

Misha Borisov
или type Box[T any] struct { value T } type INu...

upd @re_devel type Num[T any] struct { value T } func (num Num[T]) i32() Num[int32] { // конвертация в i32 return Num[int32]{} } func (num Num[T]) i64() Num[int64] { // конвертация в i64 return Num[int64]{} } func test() { Num[int]{1}.i32().i32().i32().i64().i64() }

Re- Автор вопроса

Я прекрасно понимаю что Golang делается для Google и подобных компаний. Но я его использую как язык, для создания GUI / Game. Они могут 1001 раз говорить делайте так, но в этих сферах не всегда так работает. Можно сказать ну надо взять другой инструмент. C++? Не очень хочется ходить по минам. Но в целом почти везде есть свои проблемы. Так что надо просто подумать, как решить свои проблемы.

Re
Я прекрасно понимаю что Golang делается для Google...

о! этот лейтмотив мне крайне близок. поддерживаю!

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Есть ли смысл устраиваться на 1с ? Даст это плюс в дальнейшем трудоустройстве на php? Просто у меня в городе вакансий на пхп нету. Или лучше удаленно искать. Опыта работы нету...
Azamat
14
Не ну фпц - это уже просто троллинг какой-то. Элементарный код нельзя собрать. ЧЯДНТ? program Project1; {$mode delphi} uses SysUtils, Classes, Generics.Collections; var...
Peter
4
а где есть mysql cloud кроме яндекс-клауд?
Oleg Nosov
13
hi im a cs student. i need some advice from people who have enough experience in Embedded Software. I need to know whether this profession is suitable for me. I have watched s...
Sahand 🏔️
8
А кто-нибудь запихивал сборку перловых модулей/образов с perl приложениями в окружения без интернета (в специализированном CI/CD)? У меня сейчас есть ряд cpanfile, которые н...
Andrey Smirnov / 𝓪𝓵𝓵𝓽𝓮𝓻 /
14
Карта сайта