【发布时间】:2017-08-04 12:05:59
【问题描述】:
有没有办法在不检查每个元素或使用反射的情况下检查字节切片是空还是 0?
theByteVar := make([]byte, 128)
if "theByteVar is empty or zeroes" {
doSomething()
}
我发现一个看起来很奇怪的解决方案是保留一个空字节数组进行比较。
theByteVar := make([]byte, 128)
emptyByteVar := make([]byte, 128)
// fill with anything
theByteVar[1] = 2
if reflect.DeepEqual(theByteVar,empty) == false {
doSomething(theByteVar)
}
肯定有更好/更快的解决方案。
谢谢
UPDATE 对 1000 个循环进行了比较,反射方式是迄今为止最差的......
Equal Loops: 1000 in true in 19.197µs
Contains Loops: 1000 in true in 34.507µs
AllZero Loops: 1000 in true in 117.275µs
Reflect Loops: 1000 in true in 14.616277ms
【问题讨论】:
-
最初,theByteVar 的 len() 为 0,cap() 为 128。len() 为 0 表示它为空。如果不为空,则可以使用 for/range 来测试非零值,并在它不为空时在第一次出现时中断。
-
但是,您似乎对切片和数组感到困惑。确保了解其中的区别。对于数组,您需要遍历所有元素以测试非零。
-
看来 len 也返回 128,所以我无法检查是否为空。 play.golang.org/p/plx-vt0XjC