我正在尝试使用Go语言从WebSockets连接中解析一个字符串。我正在实现连接的两端,因此数据格式的规范仅取决于我。
由于这是一个简单的应用程序(通常用于学习),我想到了ActionId Data,其中ActionId是一个uint8。BackendHandler是WebSocket连接中每个请求的处理程序。
平台资讯
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(取决于文件结尾,在其他操作系统上可能看起来有所不同)。可以通过添加重新切片的结束索引来固定此代码,方法是:
_, ok := strconv.Atoui(str[2:3])
相关分类