dmnBrest
@dmnBrest
Salesforce for money. Python, Go, Ruby for soul.

Как правильно передавать данные в http hendler на golang?

Только разбираюсь в golang (до этого работал на Rails).
Так сказать магия рельсов наложила свой отпечаток.
Разбираюсь с созданием web приложения на go пока без модных фреймворков (Martini и выше).
Для того чтобы разобраться взял вот этот пример https://github.com/haruyama/golang-goji-sample
здесь Goji + части от Gorilla
Вот что смутило - зачем все данные в контроллер (http handler) передают через контекст, который заполняют в middleware? Видел это, наверное во всех примерах в нете. Почему нельзя просто сделать глобальную переменную, проинизиализировать в main и просто обращаться из контроллера? В этом есть какое-то скрытый смысл на go или так делают что было удобно?

UPD: Вот нашел в одной статье вот такую интересную информацию:

There's three ways that Go's web libraries/frameworks have attacked the problem of request contexts:

A global map, with *http.Request as the key, mutexes to synchronise writes, and middleware to cleanup old requests (gorilla/context)

A strictly per-request map by creating custom handler types (goji)

Structs, and creating middleware as methods with pointer receivers or passing the struct to your handlers (gocraft/web).


Вот тут по ходу подтверждение моих догадок :) www.alexedwards.net/blog/understanding-mutexes
  • Вопрос задан
  • 5413 просмотров
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
-не идеоматично делать символы глобальней необходимого, для контекста достаточно пространства запроса/соединения, пространство main избыточно
-все типы в Go конкурентно безопасны только для чтения из коробки
-на сегодня самое идеоматичное решение https://blog.golang.org/context godoc.org/code.google.com/p/go.net/context
первые два пункта - имхо, последний - стратегия ключевых разработчиков языка
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Boniface
@Boniface
Не работал с Gorilla. Но смысл скорее всего один и тот же. Вы определяете функцию, которая принимает Response и Request. Затем регистрируете ее в http.HandleFunc.

package main

import (
	"io"
	"net/http"
	"log"
)

// hello world, the web server
func HelloServer(w http.ResponseWriter, req *http.Request) {
	io.WriteString(w, "hello, world!\n")
}

func main() {
	http.HandleFunc("/hello", HelloServer)
	err := http.ListenAndServe(":12345", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}


Более подробно здесь golang.org/pkg/net/http
Ответ написан
Ваш ответ на вопрос

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

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