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 файл не совпадает то Анмаршл вроде же ошибку должен отдать?
  • Вопрос задан
  • 1006 просмотров
Пригласить эксперта
Ответы на вопрос 3
@ivorobioff
Software Engineer
Для начала сделай чтобы работало. Структура и все остальное формируется со временем базируясь на реальных требованиях, фактах так сказать, а не на догадках и предсказаниях. По мере поступления новых фич и требований код будет изменяться и эволюционировать, и по ходу дела правильные решения сами прийдут.
Ответ написан
@stratosmi
revel возьми, например, в качестве основы.
или beego.me
Ответ написан
@abbaboka
но я не могу понять как правильно организовать структуру проекта(из-за нехватки опыта в разработке)

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

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

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

Войти через центр авторизации
Похожие вопросы