Как решить проблему нулевого указателя websocket
Это моя версия упр
Revel Framework: 0.21.0 (0.21.0 удаленная главная ветвь) Revel Cmd: 0.21.1 (0.21.1 удаленная главная ветвь) Модули Revel: 0.21.0 (0.21.0 удаленная главная ветвь)
Вот мой код:
package controllers
import (
"github.com/revel/revel"
"golang.org/x/net/websocket"
"fmt"
"math/rand"
"time"
"strconv"
)
var users = make(map[*websocket.Conn]string)
type WebSocket struct {
*revel.Controller
}
func (w WebSocket) Chat(ws *websocket.Conn) revel.Result {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
users[ws] = strconv.Itoa(r.Intn(10000))
outMsg := "user " + users[ws] + " join in"
SendMsg(outMsg, ws)
Listen(ws)
return nil
}
func Listen(ws *websocket.Conn) {
var err error
for {
var inMsg string
if err = websocket.Message.Receive(ws, &inMsg); err != nil {
fmt.Println("Can't receive")
break
}
outMsg := users[ws] + ":" + inMsg
SendMsg(outMsg, ws)
}
}
func SendMsg(outMsg string, ws *websocket.Conn) {
for k := range users {
if err := websocket.Message.Send(k, outMsg); err != nil {
fmt.Println("Can't send")
break
}
}
}
Когда я запускаю свой код, я получаю эту ошибку: неверный адрес памяти или нулевой указатель
D:/GOPATH/src/golang.org/x/net/websocket/websocket.go:236 +0x35
github.com/revel/revel.ActionInvoker.func1(0x11e0ac0, 0xc00030e750)
D:/GOPATH/src/github.com/revel/revel/invoker.go:34 +0x38
panic(0x88fe80, 0xcb3630)
C:/Go/src/runtime/panic.go:513 +0x1c7
golang.org/x/net/websocket.Codec.Send(0x937d50, 0x937d58, 0xc00030e750, 0x864640, 0xc000270140, 0x0, 0x0)
D:/GOPATH/src/golang.org/x/net/websocket/websocket.go:315 +0xfc
WebSocket/app/controllers.SendMsg(0xc0001ec4c0, 0x11, 0xc00030e750)
D:/GOPATH/src/WebSocket/app/controllers/websocket.go:42 +0x10f
WebSocket/app/controllers.WebSocket.Chat(0xc00020da00, 0xc00030e750, 0x16, 0xc000055600)
D:/GOPATH/src/WebSocket/app/controllers/websocket.go:22 +0x225
reflect.Value.call(0x9007c0, 0xc000083bc8, 0x213, 0x913841, 0x4, 0xc0000555e0, 0x1, 0x1, 0x872580, 0x19, ...)
C:/Go/src/reflect/value.go:447 +0x450
reflect.Value.Call(0x9007c0, 0xc000083bc8, 0x213, 0xc0000555e0, 0x1, 0x1, 0x0, 0x1, 0xc0002700f0)
C:/Go/src/reflect/value.go:308 +0xab
github.com/revel/revel.ActionInvoker(0xc00020da00, 0xc0003cf808, 0x0, 0x1)
D:/GOPATH/src/github.com/revel/revel/invoker.go:45 +0x645
github.com/revel/revel.CompressFilter(0xc00020da00, 0xc0003cf800, 0x1, 0x2)
D:/GOPATH/src/github.com/revel/revel/compress.go:84 +0xa1
github.com/revel/revel.InterceptorFilter(0xc00020da00, 0xc0003cf7f8, 0x2, 0x3)
D:/GOPATH/src/github.com/revel/revel/intercept.go:108 +0xf3
WebSocket/app.glob..func1(0xc00020da00, 0xc0003cf7f0, 0x3, 0x4)
D:/GOPATH/src/WebSocket/app/init.go:37 +0x146
github.com/revel/revel.I18nFilter(0xc00020da00, 0xc0003cf7e8, 0x4, 0x5)
D:/GOPATH/src/github.com/revel/revel/i18n.go:212 +0xa6
github.com/revel/revel.ValidationFilter(0xc00020da00, 0xc0003cf7e0, 0x5, 0x6)
D:/GOPATH/src/github.com/revel/revel/validation.go:272 +0x1a1
github.com/revel/revel.FlashFilter(0xc00020da00, 0xc0003cf7d8, 0x6, 0x7)
D:/GOPATH/src/github.com/revel/revel/flash.go:50 +0x150
github.com/revel/revel.SessionFilter(0xc00020da00, 0xc0003cf7d0, 0x7, 0x8)
D:/GOPATH/src/github.com/revel/revel/session_filter.go:18 +0x17d
github.com/revel/revel.ParamsFilter(0xc00020da00, 0xc0003cf7c8, 0x8, 0x9)
D:/GOPATH/src/github.com/revel/revel/params.go:179 +0xb8
github.com/revel/revel.FilterConfiguringFilter(0xc00020da00, 0xc0003cf7c0, 0x9, 0xa)
D:/GOPATH/src/github.com/revel/revel/filterconfig.go:211 +0x12e
github.com/revel/revel.RouterFilter(0xc00020da00, 0xc0003cf7b8, 0xa, 0xb)
D:/GOPATH/src/github.com/revel/revel/router.go:792 +0x2d1
github.com/revel/revel.PanicFilter(0xc00020da00, 0xc0003cf7b0, 0xb, 0xc)
D:/GOPATH/src/github.com/revel/revel/panic.go:21 +0x9a
github.com/revel/revel.glob..func33(0xc00020da00, 0xc0003cf7a8, 0xc, 0xd)
D:/GOPATH/src/github.com/revel/revel/watcher.go:298 +0x84
github.com/revel/revel.handleInternal(0x9993a0, 0xc000255d20)
D:/GOPATH/src/github.com/revel/revel/server-engine.go:193 +0x395
github.com/revel/revel.(*GoHttpServer).handleMux.func2(0xc00030e5a0)
D:/GOPATH/src/github.com/revel/revel/server_adapter_go.go:155 +0x1e9
golang.org/x/net/websocket.Server.serveWebSocket(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
D:/GOPATH/src/golang.org/x/net/websocket/server.go:89 +0x185
golang.org/x/net/websocket.Handler.ServeHTTP(0xc000202ec0, 0x99bf60, 0xc0003de0e0, 0xc0003f4c00)
D:/GOPATH/src/golang.org/x/net/websocket/server.go:112 +0x8d
github.com/revel/revel.(*GoHttpServer).handleMux(0xc0000bd5e0, 0x99bf60, 0xc0003de0e0, 0xc0003f4c00)
D:/GOPATH/src/github.com/revel/revel/server_adapter_go.go:156 +0x27a
github.com/revel/revel.(*GoHttpServer).Handle(0xc0000bd5e0, 0x99bf60, 0xc0003de0e0, 0xc0003f4c00)
D:/GOPATH/src/github.com/revel/revel/server_adapter_go.go:104 +0x5f
github.com/revel/revel.(*GoHttpServer).Init.func3(0x99bf60, 0xc0003de0e0, 0xc0003f4c00)
D:/GOPATH/src/github.com/revel/revel/server_adapter_go.go:57 +0x4f
net/http.HandlerFunc.ServeHTTP(0xc00023d690, 0x99bf60, 0xc0003de0e0, 0xc0003f4c00)
C:/Go/src/net/http/server.go:1964 +0x4b
net/http.serverHandler.ServeHTTP(0xc00020d1e0, 0x99bf60, 0xc0003de0e0, 0xc0003f4c00)
C:/Go/src/net/http/server.go:2741 +0xb2
net/http.(*conn).serve(0xc000150960, 0x99c660, 0xc00030cb00)
C:/Go/src/net/http/server.go:1847 +0x64d
created by net/http.(*Server).Serve
C:/Go/src/net/http/server.go:2851 +0x2fc
Наконец, моя очень старая версия revel не имеет этой проблемы. Я не знаю, изменилось ли использование или облажена ошибка фреймворка.