【问题标题】:How do I convert []byte with zero values to string in Go?如何在 Go 中将具有零值的 []byte 转换为字符串?
【发布时间】:2021-07-28 09:12:12
【问题描述】:

我知道已经有这样的问题:How do I convert [Size]byte to string in Go?,但我的问题是“如何将 []byte WITH ZERO VALUES 转换为字符串”

package main

import (
    "fmt"
    "strings"
)

func main() {
    a := make([]byte, 16)

    r := strings.NewReader("test")
    _, _ = r.Read(a)

    b := "test"

    fmt.Println(string(a), b)
    fmt.Println(string(a) == b)
    fmt.Println(len(string(a)), len(b))
    fmt.Println(a, []byte(b))
}

上面的代码打印出来:

test test
false
16 4
[116 101 115 116 0 0 0 0 0 0 0 0 0 0 0 0] [116 101 115 116]

您可以看到a 中的零值导致ab 之间的不等式,我应该如何处理它们?如何正确比较两者?

【问题讨论】:

  • 那些不是空的。零仍然是一个值。但是,如果您想删除尾随零,只需使用与后备存储相同的数组,使用切片操作:aShortened := a[:len] 制作一个适当长度的切片。 (注意Read 操作返回一个长度,你应该保存它而不是扔掉它。它也会返回一个错误,你应该检查一下。)
  • 您可能应该参加 Go 之旅,了解基本的语言基础知识,例如切片的工作原理、零值是什么以及 io.Reader 的 Read 方法的工作原理。
  • 感谢@torek,长度有助于对数组进行切片!
  • 不要在您的问题中编辑答案。

标签: go


【解决方案1】:

Read 返回的长度有助于对数组进行切片:

a := make([]byte, 16)

r := strings.NewReader("test")
l, _ = r.Read(a)

b := "test"

fmt.Println(string(a[:l]) == b)) // true, they are equal!

感谢@torek

【讨论】:

    【解决方案2】:

    当你声明你的切片a:

    a := make([]byte, 16)
    

    所有元素都使用byte 的“零值”进行初始化,即0

    出于所有意图和目的,您可以认为切片已满。您可以完全或部分覆盖它,但它始终是一个 16 元素的切片,每个索引处都有一个值。

    如果您想从切片末尾修剪零值,您可以这样做:

    func trim(a []byte) []byte {
      for i := len(a) - 1; i >= 0; i-- {
        if a[i] != 0 {
          // found the first non-zero byte
          // return the slice from start to the index of the first non-zero byte
          return a[:i+1]
        }
      }
    
      // didn't find any non-zero bytes just return an empty slice
      return []byte{}
    }
    

    然后比较:

    string(trim(a)) == b
    

    【讨论】:

      猜你喜欢
      • 2014-11-22
      • 2012-12-20
      • 2012-04-23
      • 2015-03-18
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多