我正在尝试从 Go 语言的 WebSockets 连接中解析一个字符串。我正在实现连接的两端,因此数据格式的规范仅取决于我。
由于这是一个简单的应用程序(通常用于学习目的),我想出了ActionId Data
,其中 ActionId 是uint8
. BackendHandler
是 WebSocket Connection 中每个请求的处理程序。
平台信息
kuba:~$ echo {$GOARCH,$GOOS,`6g -V`}
amd64 linux 6g version release.r60.3 9516
代码:
const ( // Specifies ActionId's
SabPause = iota
)
func BackendHandler(ws *websocket.Conn) {
buf := make([]byte, 512)
_, err := ws.Read(buf)
if err != nil { panic(err.String()) }
str := string(buf)
tmp, _ := strconv.Atoi(str[:0])
data := str[2:]
fmt.Println(tmp, data)
switch tmp {
case SabPause:
// Here I get `parsing "2": invalid argument`
// when passing "0 2" to websocket connection
minutes, ok := strconv.Atoui(data)
if ok != nil {
panic(ok.String())
}
PauseSab(uint8(minutes))
default:
panic("Unmatched input for BackendHandler")
}
}
所有输出:(注意我用于检查的 Println)
0 2
panic: parsing "2": invalid argument [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
我找不到启动此错误的代码,只有定义错误代码的位置(取决于平台)。我很欣赏改进我的代码的一般想法,但主要是我只想解决转换问题。
这与我的缓冲区-> 字符串转换和切片操作(我不想使用 SplitAfter 方法)有关吗?
编辑
此代码重现了该问题:
package main
import (
"strconv"
"io/ioutil"
)
func main() {
buf , _ := ioutil.ReadFile("input")
str := string(buf)
_, ok := strconv.Atoui(str[2:])
if ok != nil {
panic(ok.String())
}
}
该文件input
必须包含0 2\r\n
(取决于文件结尾,它在其他操作系统上可能看起来不同)。可以通过为 reslice 添加结束索引来修复此代码,这样:
_, ok := strconv.Atoui(str[2:3])