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)

Способы ограничены только полетом твоей фантазии. Можно вот такой вариант сделать:

var MessageHandlers = map[string]func(json.RawMessage) error {
    "ChatMessage": ChatMessageHandler,
}

func ChatMessageHandler(msg json.RawMessage) error {


    // ...
}

handler, found := MessageHandlers[msg.Type]
if !found {
    return errors.New("No handler for this type of message")
}
err = handler(msg.Data)
// ...
derlafff ★★★★★
()
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от slaykovsky

Ну вообще то я недавно очень хотел его выучить. То, что я увидел просто напугало меня. Взять хотяб официальный сайт https://golang.org/ Подсветка синтаксиса? DLL? https://toster.ru/q/479127 Нет. Утечки памяти да. Трата памяти и диска да.

В общем я слышал о нем, что он хорош, а когда увидел его я понял, что это какой то бэйсик. Который медленнее того же Python и не имеет смысла в 99% применений.

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

Да. У меня были проблемы на сервере. Я зашел в контейнер вставил 2 принта и устранил их. А потом у меня были проблемы с Го. Я зашел и что? Ничего в итоге я потратил 3 (ТРИ КАРЛ) дня на устранение проблемы.

Далее я уже выше написал что изменение 5 строк в коде Python на боевой нагрузке в сотни раз подняло производительность. Го с тем же кодом был быстрее раза в три максимум...

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

Нет. Утечки памяти да. Трата памяти и диска да.

Не пиши код, который тратит память и диск, лол.

В общем я слышал о нем, что он хорош, а когда увидел его я понял, что это какой то бэйсик

Проорал.

Который медленнее того же Python

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

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

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

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

Т.е. проблема в неоптимальных алгоритмах и в том, что нет нормального тестирования, а виноват язык?

изменение 5 строк в коде Python на боевой нагрузке

Это шутка такая?

slaykovsky ★★★
()

Sorry, писал на коленке, но суть должна быть ясна.

Линк на плейграунд

package main

import (
	"encoding/json"
	"fmt"
)

var msgTypes = map[string]func() interface{}{
	"ChatMessage": func() interface{} {
		return new(ChatMessage)
	},
}

var testMsg = []byte(`{
	"Type": "ChatMessage",
	"Data": {
		"Username": "usr",
		"ConnectedTo": "nowhere",
		"ChatId": 123
	}
}`)

type JsonMessage struct {
	Type string
	Data json.RawMessage
}

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

func main() {
	var msg JsonMessage
	json.Unmarshal(testMsg, &msg)
	fmt.Println(GetIncludedStruct(&msg))
}

func GetIncludedStruct(msg *JsonMessage) (interface{}, error) {
	var result = msgTypes[msg.Type]()
	err := json.Unmarshal(msg.Data, &result)
	return result, err
}
SuoiCat
()
Последнее исправление: SuoiCat (всего исправлений: 2)

Гугли «golang code organization» – выпадет пару полезных линков.

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

даже асинхронный питон не может заюзать больше одного процессорного ядра в принципе.

как это связанно с асинхронностью? а вообще 4.2

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

А кто мешает ему процессы задействовать? Тут у Го тоже сложности будут... Может даже больше (ибо горутины треды юзают) и тут может производительность писец как упасть

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

А кто мешает ему процессы задействовать?

То, что в нормальный и быстрый межпроцессорный обмен питон не может еще сильнее.

Тут у Го тоже сложности будут...

Не будут

Может даже больше (ибо горутины треды юзают) и тут может производительность писец как упасть

Нет, не треды. RTFM

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

Может даже больше (ибо горутины треды юзают) и тут может производительность писец как упасть

Нет, не треды. RTFM

Вы оба два правы и неправы.

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

Ну, т.е. ты рукожоп и неосилятор, а виноват этом Go.

Угу, он тотально экономит на проверках ошибок, потому что, видите ли, строчек много, а потом винит Пайка в сумасшествии и go в том, что на нем трудно отлаживать проблемы, лол.

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

А кто мешает ему процессы задействовать?

Может даже больше (ибо горутины треды юзают) и тут может производительность писец как упасть

А при использовании процессов не может, да?

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

Угу, он тотально экономит на проверках ошибок

Нет я просто столкнулся с кодом который написал «профи» и когда коннект к СУБД не получился (не сразу, в 5-м соединении), то на поиск ошибки потратили много дней.

А утечку памяти кажется уже месяц чинят.

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

А ты это будешь автоматически делать или ручками?

Делать что? И при чём тут производительность? Если в каждую итерацию цикла вставлять sleep на 5 секунд, какая программа будет быстрее: та, в которой это сделано автоматически, или та, в которой ручками?

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

Еще раз у тебя горутины будут тредами или процессами? Еще раз NUMA

Что значит «ещё раз»? Ты каждый раз задаёшь разные вопросы.

горутины управляются рантаймом языка, некоторые из них раскидываются по разным тредам ОС. Процессы ОС тут вообще не задействованы.

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

горутины управляются рантаймом языка, некоторые из них раскидываются по разным тредам ОС. Процессы ОС тут вообще не задействованы.

Ага. Точно. И как ты гарантируешь, что горутина попадет на тот же процессор? Яж говорю тупо обновление с го 1.10 на 1.11 увеличило количество горутин в 2 раза.

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

А что тебя удивляет? Ты не слышал про такое слово как «планировщик»?

Или тебе рассказать про утечки памяти в Го?

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

Ага. Точно. И как ты гарантируешь, что горутина попадет на тот же процессор?

Зачем мне это гарантировать? Горутины про конкурентность, а не параллельность.

Яж говорю тупо обновление с го 1.10 на 1.11 увеличило количество горутин в 2 раза.

И что? Пиши багрепорт, мне нет до этого дела.

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

А, черт. Надо посмотреть, конечно, но:

which allows it to side-step the Global Interpreter Lock but also means that only picklable objects can be executed and returned.

сразу есть сомнения в том, что это быстро и юзабельно

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

Зачем мне это гарантировать? Горутины про конкурентность, а не параллельность.

Не совсем. Под капотом uvloop который порождает потоки. Или вы хотите сказать что в Го 2 горутины не могут выполняться паралельно (на разных ядрах)?

И что? Пиши багрепорт, мне нет до этого дела.

Мне тоже. Я разочаровался в ГО. Пока я вижу что проблем больше чем плюсов. Я уже говорил что за счет простой оптимизации Python может стать в разы быстрее Го.

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

Или вы хотите сказать что в Го 2 горутины не могут выполняться паралельно (на разных ядрах)?

Могут выполняться. А могут и не выполняться. Никаких гарантий ни того, ни другого.

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

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

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

Расскажи. С примером кода, воспроизводящем их.

Пример когда будет очень сложным. Есть 2 соединения. Локалка и Интернет. Когда соединение поступает по локалке запускается горутина которая лезет в Интернет. Ну вот и наступает такой момент врмени когда Интернет горутин становится ОЧЕНЬ много и весь процесс падает....

Сейчас люди чинят этот код. И учитывая что бинарь нельзя проверить на сервере это ОЧЕНЬ трудоемко. Python тут бы сэкономил кучу времени.

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

Не совсем. Под капотом uvloop который порождает потоки.

Что «не совсем»? Конкурентность — не параллелизм. Это разные термины, описывающие разные вещи.

Или вы хотите сказать что в Го 2 горутины не могут выполняться паралельно (на разных ядрах)?

Могут, но не обязаны. Ещё раз, конкурентность — про организацию кода / архитектуру приложения, как ООП, ФП, ЛП, и прочее *П.

Мне тоже. Я разочаровался в ГО. Пока я вижу что проблем больше чем плюсов. Я уже говорил что за счет простой оптимизации Python может стать в разы быстрее Го.

Тогда зачем ты пишешь в этот тред? Иди пиши в тред про Питон. Сдаётся мне, ты просто слабенький тролль, пытающийся разжечь холивар, да не удаётся.

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

Пример когда будет очень сложным. Есть 2 соединения. Локалка и Интернет. Когда соединение поступает по локалке запускается горутина которая лезет в Интернет. Ну вот и наступает такой момент врмени когда Интернет горутин становится ОЧЕНЬ много и весь процесс падает....

Очевидно, нужно поддерживать очередь запросов

И учитывая что бинарь нельзя проверить на сервере это ОЧЕНЬ И учитывая что бинарь нельзя проверить на сервере это ОЧЕНЬ трудоемкотрудоемко

ССЗБ, тестящие в продакшоне, тестят в продакшоне, всё так.

Python тут бы сэкономил кучу времени.

Тем, что какие-то конкретные обезьяны в него могут, а в go нет?

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

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

Да но на Python писать намного быстрее и проще оптимизировать. Вот пример https://codereview.stackexchange.com/questions/26822/myth-busting-sqlite3-per... тупо ручная работа с транзакциями рвет гошечку как тузик грелку...

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

Тем, что какие-то конкретные обезьяны в него могут, а в go нет?

Если у тебя раз в месяц происходит проблема, то пока ты соберешь бинарь ГО проблема уйдет (я не говорю об объеме занимаемой памяти и диска, которые в ГО больше)

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

тупо ручная работа с транзакциями рвет гошечку как тузик грелку...

Не вижу ни одного сравнения с go в числах, ни причин, почему нельзя реализовать такой же подход в go

Да но на Python писать намного быстрее и проще оптимизировать.

Для какой-то конкретной обезьянки, привыкшей к питону, может быть.

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

Тогда зачем ты пишешь в этот тред?

Интересуюсь упустил ли я чтолибо.

Могут, но не обязаны. Ещё раз, конкурентность

Давай расскажи как ты управляешь горутины будут работать паралельно или конкурентно? Вот честно

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

Если у тебя раз в месяц происходит проблема, то пока ты соберешь бинарь ГО проблема уйдет

У меня весь бекенд всех рабочих сервисов собирается за полминуты, о чем ты вообще? Ты на тостере компилируешь? В go очень быстрый компилятор.

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

Диска? Сирисли? Два десятка мегабайт разницы тебя беспокоят?

занимаемой памяти

На говнокодеров с утечками памяти и 100гб не упасешься, да.

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

Давай расскажи как ты управляешь горутины будут работать паралельно или конкурентно? Вот честно

Никак, это не нужно.

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

Не вижу ни одного сравнения с go в числах, ни причин, почему нельзя реализовать такой же подход в go

Еще раз. Го переоценен. 99% фирм хотят лучшую производительность БЕСПЛАТНО. Но они просто теряют время.

Для какой-то конкретной обезьянки, привыкшей к питону, может быть.

Обезьянки ВЕЗДЕ одинаковые. Я в свое время драйвер для работы с DBF писал получив производительность сравнимую с лучшими C либами.

dem ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.