如何解决如何将具有零值的 []byte 转换为 Go 中的字符串?
我知道已经有这样的问题: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
中的零值导致了 a
和 b
之间的不等式,我应该如何对待它们?如何正确比较两者?
解决方法
当您声明切片 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
,
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
,您可以在获得阅读器后声明您的切片“a”。然后就可以调用r.Size()方法获取切片所需的长度。
import (
"fmt"
"strings"
)
func main() {
r := strings.NewReader("test")
a := make([]byte,r.Size())
_,_ = r.Read(a)
b := "test"
fmt.Println(string(a),b) // test test
fmt.Println(string(a) == b) //true
fmt.Println(len(string(a)),len(b)) //4 4
fmt.Println(a,[]byte(b)) //[116 101 115 116] [116 101 115 116]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。