LINUX.ORG.RU

Как правильно организовать код на Go

 


0

3

Например, если создаем web-app в которой данные передаются в json формате, то:

Сначала нужно создать структуру

type JsonMessage struct {
	Type string
	Data json.RawMessage
}

Потом нужно создать под каждый запрос свою структуру

type ChatMessage struct {
	Username    string `json:"Username"`
	Message     string `json:"ConnectedTo"`
	ChatId      int    `json:"ChatId"`
}

Потом нужно создать обработчик

var msg JsonMessage
err = json.Unmarshal(message, &msg)
if err != nil {
	log.Println("Message decode failed")
	return
} 
switch msg.Type {
case "ChatMessage":
	{
		var cmsg ChatMessage
		err = json.Unmarshal(msg.Data, &cmsg)
		if err != nil {
			log.Println("Chat message decode failed")
			return
		}
		// ToDo ...
	}
	// ToDo ...
}

И в этом обработчике придется описать все возможные типы сообщений, в итоге код разрастается и становится трудным для понимания.

Посоветуйте что прочитать чтобы понять как правильно проектировать программу на Go, разбивать ее по файлам и модулям.



Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

Не увидел там того, что мне нужно.

Мне нужно что-то вроде await, который ничего на самом деле не ждет, но прерывает рутину в ioloop.

Хотя конкретно тот пример легко исправить, сделать вместо def fib async def fib

derlafff ★★★★★
()
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от tailgunner

От задачи конечно зависит, но там вроде на большом количестве дескрипторов начинаются проблемы. Во всех книгах которые я читал рекомендовали использовать select только если нужна переносимость.

pawnhearts ★★★★★
()
Ответ на: комментарий от derlafff

Что нужно поставить в бесконечный цикл вместо pass, чтобы управление временно вернулось в ioloop и корутина foo выполнилась до конца?

asyncio.sleep(0), AFAIK. Но я практически перестал программировать на Python как раз перед появлением asyncio.

tailgunner ★★★★★
()
Ответ на: комментарий от derlafff

Там sleep для этого. Но для ололо рекурсии это плохая идея. Вообще рекурсия это плохая идея в питоне.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

От задачи конечно зависит, но там вроде на большом количестве дескрипторов начинаются проблемы

Начинаются, да (причем в select(2) раньше, по очевидным причинам). Но, если ты не пытаешься сервить фейсбук со своего ноута, то пофиг.

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

Думаю, это относилось к select(2), а не к select.select.

tailgunner ★★★★★
()
Ответ на: комментарий от pawnhearts

там pypy быстрее go

JIT и многократно повторяемые операции. Что тебя здесь удивляет?

запускаешь их по количеству ядер и все. Ну и что-то блокирующее выносить в подпроцессы или в очередь и где-то отдельно обрабатываешь

Говно и палки, в этом вся соль.

WitcherGeralt ★★
()

Таких безумных питонщиков я давно не встречал...

RazrFalcon ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Более поздняя реализация epoll (если она в самом деле более поздняя) ничего не меняет для kqueue - в крайнем случае epoll тоже становится NIH (но, насколько я знаю, он был довольно прямолинейным расширением poll, так что нет).

tailgunner ★★★★★
()
Ответ на: комментарий от dem

Новое поколение неосиляторов. Когда-то это был ASN.1, теперь это protobuf. Но сопли те же.

beastie ★★★★★
()
Ответ на: комментарий от tailgunner

Похоже, ты просто не понимаешь о чём говоришь. kqueue на практике отличается от poll радикально, о переизобретении велосипеда тут говорить крайне глупо.

он был довольно прямолинейным расширением poll

Только если очень сильно поиграть смыслами.

WitcherGeralt ★★
()

Сначала нужно создать структуру

Не нужно. Нужно создать базовый тип и интерфейс над ним.

no-such-file ★★★★★
()
Ответ на: комментарий от dem

DLL? https://toster.ru/q/479127 Нет.

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

Который медленнее того же Python и не имеет смысла в 99% применений.

Плотно тебя накрыло))

dnb ★★★★
()
Ответ на: комментарий от WitcherGeralt

kqueue на практике отличается от poll радикально

Об этом и речь.

он был довольно прямолинейным расширением poll

Только если очень сильно поиграть смыслами

Похоже, ты просто не понимаешь, о чём говоришь.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 2)
Ответ на: комментарий от sniper21

Как компилируемый язык может быть медленнее интерпретируемого?

Не язык, а программа на языке.

tailgunner ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Придерживаясь твоей блестящей логики можно и poll считать прямолинейным расширением селекта.

Так оно и есть. И никакой блестящей логики для этого не нужно.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Окончательно убедившись в твоей упёртой зацикленности на раковых порождениях своего же сознания, я больше не буду расчитывать на конструктив и встревать буду реже.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

твоей упёртой зацикленности на раковых порождениях своего же сознания

(утирая слезу) Да ты поэт!

встревать буду реже

Договорились.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от slaykovsky

Го медленнее питона? Как это возможно?

ну это вполне возможно что в каких-то аспектах (на бум: какие-нибудь регеспы или специфические структуры) питон может быть быстрее. Производительность языков вообще бессмысленно сравнивать, это средняя температура по больнице, сравнивать надо именно отдельные части. Что, конечно, не отменяет факта что dem скорее всего с кривыми ручками

oxo
()
Ответ на: комментарий от dem

Я уже говорил что за счет простой оптимизации Python может стать в разы быстрее Го.

Невежество с самоуверенностью даёт на выходе вот такие умозаключения.

Юноша, не хочу вас обижать, но почитав всю ту ахинею, которую тут несёте не смог пройти мимо.

Для начала стоит напомнить, что питон - интерпретируемый язык. Он по определению не может быть быстрее рантайма го.

Про утечки памяти. Видимо вы даже близко не видели профайлер рантайма. Лучше и удобнее ещё не придумали. То что где-то подтекает - не проблема языка, а проблема программиста.

Про горутины, потоки, процессы. В го можно явно указать на каком ядре жить процессу или на скольких ядрах. Горутины же внутри рантайма балансируются. Увеличение количества потоков (или чего там) в два раза при апгрейде на новую версию попахивает ещё одним набросом на вентилятор.

Вы так легко и безапелляционно размахиваете чушью, что пришлось вмешаться и хотелось бы попросить прикладывать конкретные примеры (с кодом) всего того, что вы считаете неправильным или некорректным в поведении языка. Есть стойкое ощущение, что проблема именно в вашем невежестве

Deleted
()
Ответ на: комментарий от derlafff

у меня быстрее кстати получилось, правда в венде

anonymous
()
Ответ на: комментарий от Deleted

Для начала стоит напомнить, что питон - интерпретируемый язык.

Нет. Учите матчасть. Язык не может быть интерпретируемым.

Он по определению не может быть быстрее рантайма го.

А подушка не может быть быстрее ракеты.

Горутины же внутри рантайма балансируются.

Как балансируются? Вы этим управляете?

dem ★★
()
Ответ на: комментарий от Deleted

дальше можно не продолжать ))).

Ну вы делаете мне смешно. Тоесть интерпретируемость есть свойство языка? С++ Компилируем или интерпретируем?

dem ★★
()
Ответ на: комментарий от Deleted

Мне хочется от вас получить условия когда язык компилируем или интерпретируем. Что такое компиляция? Что такое интерпретация? Нуж давайте сударь. Я жду статисфакции...

dem ★★
()
Ответ на: комментарий от dem

Уже занял свое место в зрительном зале. Маэстро вам пора на сцену

fuzzypants
()
Ответ на: комментарий от Deleted

Не вижу смысла спорить с некомпетентностью, это бессмысленно

Зачем спорить? Просто сообщите, как определить, является ли язык интерпретируемым или компилируемым.

Например, пусть для простоты это будет brainfuck или forth.

Мне действительно интересно.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.