В настоящее время я работаю над личным проектом по изучению Golang, но у меня возникают некоторые проблемы, когда я начинаю работать над Goroutines, я думаю, что есть некоторые концепции, которые я неправильно понимаю. Короче говоря, в моем коде есть структура с функцией приемника «l oop», которая выполняет процесс каждые 10 секунд в бесконечном l oop, пока программа не завершится, она уже работает. Теперь я хочу добавить простой веб-сервер, с которого мне нужно иметь возможность обновлять некоторые данные внутри структуры во время работы l oop, вот абстракция проблемы, которую я использую для проверки случая:
package main
import (
"fmt"
"net/http"
"../thing"
)
var Thing1 thing.Thing
func main() {
Thing1 := thing.NewThing("thing1")
//This is the loop that is always running
go Thing1.Loop()
http.HandleFunc("/", HelloServer)
http.ListenAndServe(":8080", nil)
}
func HelloServer(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.Error(w, "404 Not found", http.StatusNotFound)
return
}
switch r.Method {
case "GET":
http.ServeFile(w, r, "index.html")
case "POST":
if err := r.ParseForm(); err != nil {
fmt.Fprintf(w, "There was an error with the form: %v", err)
return
}
fmt.Println("In handler: " + r.FormValue("fData"))
Thing1.UpdateData(r.FormValue("fData"))
http.ServeFile(w, r, "index.html")
default:
http.Error(w, "405 Method not allowed", http.StatusMethodNotAllowed)
}
}
package thing
import (
"fmt"
"time"
)
type Thing struct {
ID string
data string
}
func NewThing(id string) Thing {
return Thing{ID: id}
}
func (t *Thing) Loop() {
for {
now := time.Now().Format("15:04:05")
fmt.Println(t.ID + " starts at " + now)
fmt.Println(t.ID + " Data: " + t.data)
time.Sleep(time.Second * 10)
}
}
func (t *Thing) UpdateData(g string) {
t.data = g
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<p>Test control panel</p>
<form method="POST" action="/">
<label>Data</label><input type="text" name="fData" value="">
<input type="submit" value="submit">
</form>
</body>
</html>
В основном, когда я нажимаю sh кнопку отправки, я хочу обновить переменную «данные» в структуре Things1, и это должно быть отражено при печати переменной данных внутри l oop, но это не работает, переменная данных всегда печатается как пустая. Я не знаю, что делаю не так, но мне кажется, что мне не хватает фундаментальной концепции горутин. Мы будем благодарны за любые советы.