Websocket 将io字符串转到int Atoi无效参数

Websocket 将io字符串转到int Atoi无效参数,websocket,go,atoi,Websocket,Go,Atoi,我正在尝试用Go语言解析WebSockets连接中的字符串。我正在实现连接的两个方面,因此数据格式的规范只取决于我 由于这是一个简单的应用程序(通常用于学习目的),我提出了ActionId数据,其中ActionId是一个uint8BackendHandler是WebSocket连接中每个请求的处理程序 平台信息 代码: 所有输出:(注意我用于检查的Println) 我找不到启动此错误的代码,仅在定义了错误代码的地方(取决于平台)。我很欣赏改进代码的一般思路,但主要是我只想解决转换问题 这是否与我

我正在尝试用Go语言解析WebSockets连接中的字符串。我正在实现连接的两个方面,因此数据格式的规范只取决于我

由于这是一个简单的应用程序(通常用于学习目的),我提出了
ActionId数据
,其中ActionId是一个
uint8
BackendHandler
是WebSocket连接中每个请求的处理程序

平台信息 代码:

所有输出:(注意我用于检查的Println)

我找不到启动此错误的代码,仅在定义了错误代码的地方(取决于平台)。我很欣赏改进代码的一般思路,但主要是我只想解决转换问题

这是否与我的缓冲区->字符串转换和切片操作有关(我不想使用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())
  }
}
文件
输入
必须包含
0 2\r\n
(取决于文件结尾,它在其他操作系统上可能看起来不同)。可以通过添加reslice的结束索引来修复此代码,方法如下:

_, ok := strconv.Atoui(str[2:3])

您没有提供一个小型的可编译和可运行程序来说明您的问题。您也没有提供完整且有意义的打印诊断信息

我最好的猜测是,您有一个以C样式的null结尾的字符串。例如,简化代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := make([]byte, 512)
    buf = []byte("0 2\x00") // test data
    str := string(buf)
    tmp, err := strconv.Atoi(str[:0])
    if err != nil {
        fmt.Println(err)
    }
    data := str[2:]
    fmt.Println("tmp:", tmp)
    fmt.Println("str:", len(str), ";", str, ";", []byte(str))
    fmt.Println("data", len(data), ";", data, ";", []byte(data))
    // 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())
    }
    _ = minutes
}
输出:

parsing "": invalid argument
tmp: 0
str: 4 ; 0 2 ; [48 32 50 0]
data 2 ; 2 ; [50 0]
panic: parsing "2": invalid argument

runtime.panic+0xac /home/peter/gor/src/pkg/runtime/proc.c:1254
    runtime.panic(0x4492c0, 0xf840002460)
main.main+0x603 /home/peter/gopath/src/so/temp.go:24
    main.main()
runtime.mainstart+0xf /home/peter/gor/src/pkg/runtime/amd64/asm.s:78
    runtime.mainstart()
runtime.goexit /home/peter/gor/src/pkg/runtime/proc.c:246
    runtime.goexit()
----- goroutine created by -----
_rt0_amd64+0xc9 /home/peter/gor/src/pkg/runtime/amd64/asm.s:65
如果将我的打印诊断语句添加到代码中,您会看到什么

请注意,您的
tmp,:=strconv.Atoi(str[:0])
语句可能是错误的,因为
str[:0]
相当于
str[0:0]
,它相当于空的
字符串

我怀疑您的问题是忽略了
ws.Read
中的
n
返回值。例如(包括诊断消息),我希望

buf := make([]byte, 512)
buf = buf[:cap(buf)]
n, err := ws.Read(buf)
if err != nil {
    panic(err.String())
}
fmt.Println(len(buf), n)
buf = buf[:n]
fmt.Println(len(buf), n)
另外,尝试使用此代码设置
tmp

tmp, err := strconv.Atoi(str[:1])
if err != nil {
    panic(err.String())
}

请添加关于Go版本、操作系统、平台和一如既往的信息-一个复制问题的小而完整的可编译程序。我在复制时发现了问题:如果我像这样重新切片:
str[2:3]
,那么它在Atoi中就不起作用了。我把简化的代码放在上面的问题中,我目前正试图用一个更简单的程序来重现它。语句
tmp,
有效,这对我来说也是一个谜
strconv.Atoi(str[:0])
,空的
字符串总是返回零,它适用于
str=“0 2”
,但不适用于
“9 2”
。不要忽略n的值。试试我发布的代码。你看到了什么?是的,现在可以用了。我应该将缓冲区剪切到Read()返回的大小,谢谢。从您的检查日志中,它会打印
20 3
(20也很好,我已经更改了缓冲区大小)
parsing "": invalid argument
tmp: 0
str: 4 ; 0 2 ; [48 32 50 0]
data 2 ; 2 ; [50 0]
panic: parsing "2": invalid argument

runtime.panic+0xac /home/peter/gor/src/pkg/runtime/proc.c:1254
    runtime.panic(0x4492c0, 0xf840002460)
main.main+0x603 /home/peter/gopath/src/so/temp.go:24
    main.main()
runtime.mainstart+0xf /home/peter/gor/src/pkg/runtime/amd64/asm.s:78
    runtime.mainstart()
runtime.goexit /home/peter/gor/src/pkg/runtime/proc.c:246
    runtime.goexit()
----- goroutine created by -----
_rt0_amd64+0xc9 /home/peter/gor/src/pkg/runtime/amd64/asm.s:65
buf := make([]byte, 512)
buf = buf[:cap(buf)]
n, err := ws.Read(buf)
if err != nil {
    panic(err.String())
}
fmt.Println(len(buf), n)
buf = buf[:n]
fmt.Println(len(buf), n)
tmp, err := strconv.Atoi(str[:1])
if err != nil {
    panic(err.String())
}