将io字符串转换为int Atoi无效参数

我正在尝试使用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])


呼如林
浏览 260回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go