Во-первых, я хотел бы поблагодарить ThunderCat и Рамиля за помощь, ваши ответы дали мне север, чтобы найти правильный ответ.
Короткий ответ таков: у меня нет связей без состояния, поэтому я могуне делайте то, что я искал.
Как только это сказал, причина, по которой я думаю (на основе RFC 7230), что это не так, заключается в том, что:
- В традиционномВ приложении веб-сервера у нас есть программа, которая обрабатывает соединения (Apache, nginx и т. д.) и открывает поток для маршрутизируемого приложения, в то время как в Go мы оба работаем в одном приложении, поэтому все глобальное всегда распределяется между соединениями.
- В языках, которые могут работать как Go (приложение, которое открывает порт и продолжает его слушать), например C ++, они ориентированы на объекты, поэтому даже общедоступные переменные находятся внутри класса, поэтому вы не будете делиться им, так как вам придетсякаждый раз создавайте экземпляр класса.
Создание потока решит проблему, но у Go его нет, вместо этого у него есть Goroutines, более подробнооб этом в:
https://translate.google.com/translate?sl=ko&tl=en&u=https%3A%2F%2Ftech.ssut.me%2F2017%2F08%2F20%2Fgoroutine-vs-threads%2F
Через несколько дней после этого и помощи здесь я исправлю это, изменив мою структуру на type и поместив ее локально, вот так:
package main
import (
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"github.com/rs/cors"
"net/http"
"reflect"
"time"
)
type Out struct {
Code int `json:"status"`
Message []interface{} `json:"message"`
}
func Clear(v interface{}) {
p := reflect.ValueOf(v).Elem()
p.Set(reflect.Zero(p.Type()))
}
func YourHandler(w http.ResponseWriter, r *http.Request) {
localOut := Out{0,nil}
// w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers","Content-Type,access-control-allow-origin, access-control-allow-headers")
w.WriteHeader(http.StatusOK)
for i:=0; i<10; i++ {
localOut.Code = localOut.Code + 1
localOut.Message = append(localOut.Message, "Running...")
time.Sleep(1000 * time.Millisecond)
if err := json.NewEncoder(w).Encode(localOut)
err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
}
func main() {
r := mux.NewRouter()
r.StrictSlash(true);
r.HandleFunc("/", YourHandler)
handler := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
AllowCredentials: true,
Debug: true,
AllowedHeaders: []string{"X-Session-Token","Content-Type"},
AllowedMethods: []string{"GET","POST","PUT","DELETE"},
}).Handler(r)
fmt.Println("Working in localhost:5000")
http.ListenAndServe(":5000", handler)
}
Конечно, это займет несколько недель, поэтому сейчас я поставил свое приложение за nginx, и теперь оно работает как положено.