Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
1

Маршрутизатор Echo для Golang и маршруты в отдельном файле

23.08.2021, 21:25. Показов 2962. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго вечера, господа профессионалы.
Использую маршрутизатор Echo https://echo.labstack.com/ и возник вопрос о выносе маршрутов за пределы main и функции main(). Для этого создал отдельный файл routes.go
Go
1
2
3
4
5
6
7
8
9
10
11
//routes.go
package main
 
import "github.com/labstack/echo"
 
func Routes() *echo.Echo {
    e := echo.New()
    e.GET("/adduser/", Add_user)
    e.GET("/killuser/", Kill_user)
    return e
}
определил adduser.go для вызова html-страниц
Go
1
2
3
4
5
6
7
8
9
10
11
12
//adduser.go
package main
 
import "github.com/labstack/echo"
 
func Add_user(c echo.Context) error {
    return c.File("./html/adduser.html")
}
 
func Kill_user(c echo.Context) error {
    return c.File("./html/killuser.html")
}
ну и внес маршруты в srv в main.go
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main
 
import (
        "database/sql"
    "log"
 
    "github.com/BurntSushi/toml"
        _ "github.com/go-sql-driver/mysql"
)
 
type (
    Config struct {
        Connection Connection `toml:"connection"`
    }
 
    Connection struct {
        Host   string `toml:"host"`
        Port   string `toml:"port"`
        DBName string `toml:"dbname"`
        User   string `toml:"user"`
    }
)
 
func main() {
    var cfg Config
    if _, err := toml.DecodeFile("./conn.toml", &cfg); err != nil {
        log.Fatal(err)
    }
    conn := cfg.Connection.User + ":" + ":bad_password+@tcp(" + cfg.Connection.Host + ":3306)/" +
        cfg.Connection.DBName + "?parseTime=true"
    db, _ := sql.Open("mysql", conn)
    if db == nil {
        db.Close()
        log.Fatal("can't connect to database")
     }
    defer db.Close()
    srv := Routes()
    srv.Logger.Fatal(srv.Start(cfg.Connection.Host + ":" + cfg.Connection.Port))
}
И всё вроде бы хорошо: сервер стартует обе страницы переключаются между собой, отображаются, но почему-то весь вечер мой внутренний голос мне твердит, что за такую реализацию меня даже в ад не пустят... И нужно как-то использовать для этого templates
Познания в GO - 2 недели чтива, так что попрошу:
а) без оскорблений в мой адрес;
б) помочь понять, потому как ни синтаксис, ни структура GO мне пока ещё не понятны.
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2021, 21:25
Ответы с готовыми решениями:

Вывести символы, используя только три ECHO. Echo '0', Echo '*', Echo '\n' (использовать цикл)
Вывести символы, используя только три ECHO. Echo '0', Echo '*', Echo '\n' (использовать цикл)....

Правильно ли для отделения каких то данных расположить в отдельном .cpp файле с заголовком .h
Здравствуйте, хотел спросить совет... Правильно ли для отделения каких то данных(скорее всего...

Структура "Маршруты", найти маршруты начинающиеся или оканчивающиеся в заданном пункте
Здравствуйте. Дано такое задание: "Написать программу, отладить ее, протестировать. При...

Структура "Маршруты": найти маршруты начинающиеся или заканчивающиеся в заданном пункте
1. Создать структуру с именем MARSH, котороя местит в себе такие поля: • BEGST — название первого...

10
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
23.08.2021, 21:35 2
Цитата Сообщение от drvolodko Посмотреть сообщение
возник вопрос о выносе маршрутов
Цитата Сообщение от drvolodko Посмотреть сообщение
И нужно как-то использовать для этого templates
Темплейты не для маршрутов.
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
24.08.2021, 07:14  [ТС] 3
Цитата Сообщение от korvin_ Посмотреть сообщение
Темплейты не для маршрутов.
ну, возможно не верно выразился. Для шаблонов html-страниц?
Мне необходимо переключаться между страничками, выполнять там какие-то действия (отображать данные для пользователя, забирать с формы и записывать в БД). Пока знаний хватило на такую реализацию. Вот и интересно правильно так или нет.
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
24.08.2021, 15:21  [ТС] 4
Всё верно. Я не так выразился. Сбило слово "маршрутизатор". А работать надо было с шаблонами.
И я действительно всё совсем не правильно делал.
Надо было так
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//routes.go
package main
 
import (
    "html/template"
    "io"
 
    "github.com/labstack/echo"
    "github.com/labstack/echo/middleware"
)
 
type Template struct {
    templates *template.Template
}
 
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
    return t.templates.ExecuteTemplate(w, name, data)
}
 
func Routes() *echo.Echo {
    t := &Template{
        templates: template.Must(template.ParseGlob("html/*.html")),
    }
    e := echo.New()
    e.Renderer = t
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
    e.GET("/adduser/", Add_user)
    e.GET("/killuser/", Kill_user)
    return e
}
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//adduser.go
package main
 
import (
    "net/http"
 
    "github.com/labstack/echo"
)
 
func Add_user(c echo.Context) error {
    return c.Render(http.StatusOK, "adduser.html", "Add_user")
}
func Kill_user(c echo.Context) error {
    return c.Render(http.StatusOK, "killuser.html", "Add_user")
}
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
24.08.2021, 18:18 5
Лучший ответ Сообщение было отмечено drvolodko как решение

Решение

Цитата Сообщение от drvolodko Посмотреть сообщение
Add_user
В Go не принято использовать такой стиль имён. Нужно AddUser.

По поводу шаблонов: стоит рассмотреть разделение UI (HTML/JS/CSS) и API (JSON):
1) сервер (бэкенд) на Go реализует только HTTP-JSON-API без всяких страниц. Часто это называют REST-API.
2) на JS/HTML/CSS пишется отдельно фронденд, который делает запросы к бэкенду и рендерит страницу. Есть много разных фреймворков: Angular, React, Vue и прочее.
3) NGINX выступает в качестве reverse-proxy для предоставления доступа к UI и API через один адрес, раздаёт статику (в том числе фронтенд из пункта 2).

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

Вместо JS/HTML/CSS можно использовать то, что знаешь, Java/C#/Qt/Delphi/итд. Тогда и NGINX не нужен, просто напрямую подключаешься к API-серверу на Go.
1
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
24.08.2021, 19:28  [ТС] 6
Цитата Сообщение от korvin_ Посмотреть сообщение
В Go не принято использовать такой стиль имён. Нужно AddUser.
Привычка с Delphi.
Цитата Сообщение от korvin_ Посмотреть сообщение
сложновато одновременно изучать Go и всю кухню веб-фронтендов
Согласен, но я единственный программист в конторе... У нас не IT специализация, а я хочу полностью уйти именно в программирование. А Delphi для этого явно не достаточно.
Да и то, что можно использовать Delphi вместо JS/HTML/CSS я знаю, но что-то десктоп уже поднадоел, хотя...
Но думаю, чтобы всё таки норм изучить GO, хочу переписать все мной ранее написанное на Delphi. Ну и скорее всего все таки делать веб-фронтенд. Это уже как-то более современно..
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
24.08.2021, 20:14 7
drvolodko, а ты уверен, что пользователи оценят такое изменение? Помнится, Сашок-что-с-башкой переписал какую-то программулину для АТЦ с FoxPro на Java/Swing, и ему пришлось весь UI сделать по сути такой же, какой был на старом FoxPro под DOS, а не как нормальный десктопный гуй. С web такое не прокатит. Даже с переходом с Delphi на web. Да и с табелем было ни разу не гладко. Имеет смысл начать с выноса всех расчётных функций и хранение данных из Delphi в сервер на Go, а в Delphi-приложениях оставить просто запросы к серверу и отображение результатов, например. А потом уже гуй переписывать по чуть-чуть.
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
25.08.2021, 00:30 8
Go
1
2
3
if db == nil {
        db.Close()
}
Это очень плохо. Обращение к нулевому указателю приводит к немедленной и страшной гибели приложения :-) В общем, если не хочешь видеть в консоли огромные портянки трейсбека (а они таковы), сделай так, чтобы твой код никогда в жизни даже не подумал обратиться к nil указателю.
Это не сложно - нужно лишь всегда проверять переменную указательного типа на != nil
Возможно, когда-нибудь в Go завезут оператор безопасного доступа?, но пока только так...

P.S. Проверять же db на nil вообще не нужно. В доке написано - просто пингуйте, чтобы проверить наличие подключения и проверяйте ошибку пинга.
Если ошибка == nil, то db никогда не будет nil.

P.P.S. По поводу ошибок, которые должна возвращать sql.Open.
Если открыть ее исходный код, то становится понятно, что она вернет ошибку
1) если мы укажем несуществующее имя драйвера (например, "superpupermysql"),
2) либо если ошибку вернет сам драйвер, которому Open делегирует весь дальнейший процесс подключения.
Так что если mysql драйвер не хочет возвращать ошибку на неверные параметры подключения, то ничего не поделаешь - так уж реализовано разработчиками. Поэтому делаем db.Ping.
2
-28 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
25.08.2021, 07:12 9
Цитата Сообщение от drvolodko Посмотреть сообщение
И всё вроде бы хорошо: сервер стартует обе страницы переключаются между собой, отображаются, но почему-то весь вечер мой внутренний голос мне твердит, что за такую реализацию меня даже в ад не пустят... И нужно как-то использовать для этого templates
Познания в GO - 2 недели чтива, так что попрошу:
а) без оскорблений в мой адрес;
б) помочь понять, потому как ни синтаксис, ни структура GO мне пока ещё не понятны.
Спасибо.
Выше по драйвер БД Вам уже отметили. "Все работает" - ровно до первого обращения к драйверу. После Open() стоит смотреть не столько ошибку, сколько пинговать соединение, что оно приключилось.

Далее, main():
1. Переменная cfg объявлена, но ничего не содержит .. соответственно все, где она используется .. "работает условно", по умолчанию.
2. Не применимость Close() к nil указателю - это выше, а вот то, что сама Close() также возвращает СВОЮ(!) ошибку, и она остается не обработана - то Вам легко могут зачесть как "косячок" ..
3.
Цитата Сообщение от drvolodko Посмотреть сообщение
db, _ := sql.Open("mysql", conn)
как раз наоборот. Проверять корректность надо у ошибки, а Вы ее проигнорировали. Вот ежели она есть, то db никому не нужен (и чаще всего возврат результата окажется как раз nil!). У Вас ошибка по сути НЕ логируется тут.

.. остальное? А остальное ИНАЧЕ, Вы все равно не напишете .. это же Го! Один язык для джунов и сеньоров с разрабами.. (а то вдруг сеньор коде ревью делать не умеет)
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
25.08.2021, 08:44  [ТС] 10
Цитата Сообщение от korvin_ Посмотреть сообщение
Сашок-что-с-башкой переписал какую-то программулину для АТЦ с FoxPro на Java/Swing
Ну насчёт Сашка ты прав, но зачем мне накой же интерфейс делать? Возможно в чём-то и будет схоже, но я вно не полностью.
Хотя, возможно, ты и прав. Может пока фронт оставить на Delphi надо... Думаю над этим уже..
Garry Galler, про дб я специально выложил. Мало ли заметят и надают люлей. Спасибо за замечание.
Цитата Сообщение от Arhat109 Посмотреть сообщение
Переменная cfg объявлена, но ничего не содержит ..
Как это?
Go
1
2
3
4
 var cfg Config
    if _, err := toml.DecodeFile("./conn.toml",&cfg); err != nil {
        log.Fatal(err)
    }
0
-28 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
25.08.2021, 08:50 11
Цитата Сообщение от drvolodko Посмотреть сообщение
Как это?
Сорри, с утра глаза не продрал ещё.

По конкретно этому оператору: у кого как, но у нас "не комильфо" писать составной оператор Го. Не очевиден, := слева часто имеет полуопределенный набор переменных, перекрытие которых также не всегда очевидно.

Одна из причин почему не заметил. Кстати.
0
25.08.2021, 08:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2021, 08:50
Помогаю со студенческими работами здесь

Функция в отдельном файле
Всем привет! Учусь писать код в разных файлах, возникла проблема с подобным кодом: main.cpp ...

Скрипт в отдельном файле
<html> <head> <title>Считаем </title> <SCRIPT type="text/javascript"> function...

Переменные в отдельном файле
Есть вот такая программка из нескольких файлов. Компилируется без ошибок. А сам вопрос в...

Скрипт в отдельном файле
<html> <head> <title>Считаем </title> <SCRIPT type="text/javascript"> function...

Классы в отдельном файле
Такой вопрос. У меня есть сферический класс в вакууме, он мне нужен в большом количестве нужных мне...

Функции в отдельном файле
всем привет, помогите пожалуйста хочу написать набор геометрических функций в отдельном файле, но...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru