Я пытаюсь преобразовать мой HTTP-сервер node.js в Go. Вот что я хочу, чтобы произошло:
У меня есть ресурс, который генерируется периодически (скажем, каждую секунду или около того), и я хочу, чтобы все запросы на этот ресурс ждали до следующего генерирования. Таким образом, клиенты могут опрашивать и гарантированно получать только актуальный ресурс. Я использую web.go , чтобы устранить большую сложность работы HTTP-сервера.
Вот краткая версия моего кода:
package main
import (
"time"
"web"
"fmt"
vector "container/vector"
)
var listeners vector.Vector;
func resource (ctx *web.Context) {
c := make(chan int)
listeners.Push(c)
go func() {
<-c
go func() {
ctx.WriteString("Cool")
fmt.Println("Wrote something")
}()
}()
}
func resourceLoop() {
time.Sleep(5 * 1000 * 1000000) // sleep for 5 seconds
for ; listeners.Len() > 0 ; {
c := listeners.Pop().(chan int)
c <- 1
}
go resourceLoop()
}
func main() {
web.Get("/resource", resource)
go resourceLoop()
web.Run("localhost:4000")
}
Я ожидаю, что там будет Context.End () или аналогичная функция, но, похоже, ее нет. Я прочитал источник для web.go, но не смог выяснить, где он заканчивал ответ ( web.go : 268 - это место, где вызывается мой ресурс ()). В node.js это тривиально, вы можете вызвать ServerResponse.end ().
Когда я убиваю сервер во время выполнения скрипта в Chrome, я получаю следующий вывод (кажется, что он правильный, за исключением того, что ответ не заканчивается):
4
Cool
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Sat, 16 Apr 2011 00:37:58 GMT
Server: web.go
Transfer-Encoding: chunked
0
Это проблема с фреймворком web.go или я что-то не так делаю? Если это проблема с фреймворком, я подам ему проблему.
Я довольно новичок в Go, так что я могу ошибаться.