【问题标题】:In Golang, transformation from int64 to string and then slice doesn't work在 Golang 中,从 int64 转换为 string 然后 slice 不起作用
【发布时间】:2016-09-11 13:41:50
【问题描述】:

我在从 API 接收压缩响应的客户端上有此代码:

client := &http.Client{}
response, _ := client.Do(r)

// Check that the server actual sent compressed data
var reader io.ReadCloser
switch response.Header.Get("Content-Encoding") {
case "gzip":
    reader, err := gzip.NewReader(response.Body)
    if err != nil {
        log.Fatal(err)
    }
    defer reader.Close()
default:
    reader = response.Body
}

token, err := io.Copy(os.Stdout, reader)
if err != nil {
    log.Fatal(err)
}

cadenita := strconv.FormatInt(token, 10)

fmt.Println(cadenita)

cadena := "code=b2cc1793-cb7a-ea8d-3c82-766557"
fmt.Println(cadena[5:])

这段代码显示:

但是,如果我直接在 cadenita 上使用 [5:],虽然它也是一个字符串,但我有这个错误。

我希望能够对转换为字符串的令牌(int64)进行切片和正则表达式。我该怎么做?

【问题讨论】:

  • 运行时错误是由于使用了 [5:]。这意味着我想要从索引 5 到字符串末尾的字符。但是,既然您的令牌包含至少 6 位数字(例如 100 000),您怎么办?
  • 您的字符串少于 5 个字符。在索引之前验证它
  • @Jean-NicolasMoal 是的,它至少有 6 位数字。我刚刚更新了我的帖子

标签: string go int64


【解决方案1】:

io.Copy 返回复制的字节数,这就是令牌变量中的值,因此对于您的示例,该值在 40 区域内。 FormatInt 将其转换为只有 2 个字符的字符串“40”,因此当您请求从“40”的第 5 个字符开始的子字符串时,它会出错。

您是否尝试获取令牌中的实际响应数据?如果是这样,您需要将其复制到缓冲区中,例如

buff := bytes.Buffer{}
_, err := io.Copy(&buff, reader)
if err != nil {
    log.Fatal(err)
}
fmt.Println(buff.String()[5:])

【讨论】:

  • 如果 io.Copy 返回咬的数量,在我的示例中 cadenita 显示的是字符串而不是数字是怎么回事?
  • 因为你将响应复制到stdOut,输出来自Copy调用,行尾的35来自“token”值
  • 因为不会使用token,所以该行可以替换为_, err := io.Copy(&buff, reader)
猜你喜欢
  • 1970-01-01
  • 2020-10-05
  • 2018-07-04
  • 2014-02-27
  • 1970-01-01
  • 2011-08-24
  • 2013-09-27
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多