Задать вопрос
Djam36
@Djam36

Как правильно писать web приложения на GO?

Привет, учу GO, параллельно пытаюсь написать приложение на GO простая работа с API twitch, но я не могу понять как правильно организовать структуру проекта(из-за нехватки опыта в разработке) уже 3 день сижу кручу-верчу и не знаю как правильно сделать, сейчас делаю вот так:
goTwitch - корневая директория проекта
- model - работа с бд и консулом
- controller - сюда запихиваю обработку конфигов(парсеры) пока не придумал что тут еще будет
- route - это роуты приложения
- templates - это темплейты приложения

Что-то мне кажется эта структура какая-то хрень
main файл выглядит пока вот так

package main

import (
	"goTwitch/controller"
	"fmt"
	"net/http"
	"time"
	"log"
	"goTwitch/route"
)

func main() {
	Serverconfig := controller.ConfigPars()  //парсим конфиг
	handler := http.NewServeMux()
    handler.HandleFunc("/hello/" , route.Handlers(w http.Request, r *http.Request{})) - Это функция обработчик из файла route
	s := http.Server{  //Параметры сервера 
		 Addr: Serverconfig.Port, 
		 Handler: handler,
		 ReadTimeout: time.Duration(Serverconfig.ReadTimeout) * time.Second,  
		 WriteTimeout: time.Duration(Serverconfig.WriteTimeout) * time.Second,
	}
	    log.Fatal(s.ListenAndServe()) -//запуск сервера 
	}


Файл route

package route

import "net/http"

func Handlers(r *http.Request) {
 Каокй-то код обработки
}


config.go - парсим yaml с конфигурацией веб сервера
package controller

import (
	"io/ioutil"
	"path/filepath"

	"gopkg.in/yaml.v2"
	"log"
)

type Serverconfig struct {
	Port         string `yaml:"Port"`
	ReadTimeout  int    `yaml:"ReadTimeout"`
	WriteTimeout int    `yaml:"WriteTimeout"`
}

func ConfigPars() *Serverconfig {
	filename, _ := filepath.Abs("./config.yml")
	yamlFile, err := ioutil.ReadFile(filename)
	if err != nil {
		panic(err)
	}
	Serverconfig := &Serverconfig{}
	//err = yaml.Decoder{ &Serverconfig}
	err = yaml.Unmarshal(yamlFile, &Serverconfig)
	if err != nil {
		log.Fatal(err)
	}
	return Serverconfig
}


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

Есть еще вопрос касательный парсера yaml файла, если из файла yaml убрать Port: :9090 конфиг парсится и не ругается на то что не совпадает со структурой в go, что я делаю не правильно? вроде если по структуре в go файл не совпадает то Анмаршл вроде же ошибку должен отдать?
  • Вопрос задан
  • 1091 просмотр
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@stratosmi
revel возьми, например, в качестве основы.
или beego.me
Ответ написан
Комментировать
@abbaboka
но я не могу понять как правильно организовать структуру проекта(из-за нехватки опыта в разработке)

Взять готовый фреймворк, который подразумевает определеннную организацию файлов.

Так что полные фреймворки для веб-приложений особо не нужны в Go.
Но в вашем случае - стоит взять их чтобы они вас направляли.
Полные, не сокращенные. То есть типа Revel.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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