Как стать автором
Обновить

Знакомство с Go и Mggo Framework

Время на прочтение3 мин
Количество просмотров8.3K
Всем привет! Хочу поделиться первым опытом программирования на языке Go.

Cвою дорогу в программирование я начал как frontend разработчик. Далее перешёл на backend на Python и, немного для себя, на C# Asp.Net MVC. Но вот недавно, пару месяцев назад, я познакомился с этим прекрасным языком Go.

Почему Go?


1 — компилируемый язык.
2 — очень необычный язык.

Структуры, интерфейсы… пришлось ломать свой мозг, переучиваться. И первые проблемы, кончено, это именно переучиваться. Где классы? Где ООП? Где любимые паттерны?

Но немного поломав голову, язык Go мне раскрылся и я его полюбил. Ну и, конечно, первым делом решил написать свой первый «велосипед», а именно web framework под названием MGGO.

Что я хотел и к чему стремился


Конечно сразу хотелось сделать MVC framework наподобие Asp.Net. Но это оказалось не так просто, потому что язык Go своеобразный. Но вот что получилось:

Контроллеры (controller)


Контроллер это структура, в котором методы могут быть как внешние(api) так и только внутренние, а также, которые отвечают за представление(view).

Сразу на примере рассмотрим контроллер новостей.

import mggo

type News struct{
   ID int
   Title string
   Text string 
}
func NewNews() *NewNews{
   return &NewNews{}
}
func init() {
    // регистрируем контроллер
   mggo.RegisterController("news", NewNews)
}

func(n *News) Read(ctx *mggo.BaseContext) News{
   return News{1, "First News", "Text first News"}
}

func(n *News) IndexView(ctx *mggo.BaseContext, data *mggo.ViewData, path []string){
   data.View = "news/news.html"
   data.Data["News"]
   data.Data["News"] = n.Read()
}


После этого новости доступны по ссылке /news/

Где news — это имя контроллера, а основная страница это index, за которую отвечает метод IndexView.

Теперь про api. У контроллера News есть метод Read. По умолчанию он только сервисный. Для того, чтобы разрешать api запрос к данному методу, нужно в функции контроллера «init» добавить права на метод.

func init(){
   ...
   mggo.AppendRight("News.Read", mggo.RRightGuest)
}

После этого метод Read доступен для api вызова любому пользователю.

fetch("/api/", {
        "method": "POST",
        "headers": {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        "body": JSON.stringify({
            "method": "News.Read",
            "params": {}
        })
}).then(res => res.Json()).then(console.log) 

Результат

{result: {ID:1, Title:"First News", Text:"Text first News"}}

Немного о параметрах. Все параметры внутри объекта params будут переданы в качестве полей структуры.

Для примера немного изменим функцию Read:

func(n *News) Read(ctx *mggo.BaseContext) News{
   if n.ID ==1 {
      return News{1, "First News", "Text first News"}
   } else {
      return News{}
   }
}

И api вызов должен быть с параметром ID:1 — params{ID:1})

Что еще?


PostgreSQL. В framework подключена библиотека go-pg. Давайте сразу на примере. Наш контроллер новостей имеет статичные данные. Нужно это изменить. Для этого первым делом нужно создать таблицу News. Добавляем пару строчек в функцию init.

func init(){
   ...
   mggo.InitCallback(func(){
      mggo.CreateTable([]interface{}{(*News)(nil)})
   })
}

Теперь после инициализации мы получим таблицу news, с полями id, title и text.

Меняем метод Read:

func(n *News) Read(ctx *mggo.BaseContext) News{
   mggo.SQL().Select(n)
   return *n
}

Если мы вызовем метод News.Read с параметром ID:1, то в результате получим данные из таблицы news с ключом 1.

Про возможности go-pg можно ознакомиться в документации.

Но это ещё не все. Все описать тут не получится. Надеюсь, напишу и выложу подробную документацию вскоре. Вот вкратце что ещё умеет Mggo.

⁃ Веб сокеты
⁃ События серверные и клиентские
⁃ Кэширование результатов метода
⁃ Поддержка JsonRPC вызовов
⁃ Либа для быстрого создание контроллера и view

На этом пока все. Надеюсь, кому-то статья будет полезной. Конечно, есть куча других готовых и крутых фреймворков. Я лишь хотел попробовать сделать что-то свое для своего личного опыта.

Ссылка на проект

Ссылка на пример и быстрый старт
Теги:
Хабы:
+3
Комментарии7

Публикации

Истории

Работа

Go разработчик
130 вакансий

Ближайшие события