【问题标题】:Unable to compare byte slices无法比较字节片
【发布时间】:2021-09-02 08:47:01
【问题描述】:

我正在尝试编写一个单元测试用例,其中我使用reflect.DeepEqual 到compare 计算和预期结果。结构中的条目之一是字节切片,DeepEqual 不断失败。

示例代码https://goplay.space/#OcAPkK-EqDX

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a = []byte("qwedsa")
    var b [6]byte
    copy(b[:], a)
    fmt.Println(reflect.DeepEqual(a, b), len(a), len(b), cap(a), cap(b))
}

【问题讨论】:

  • reflect.DeepEqual 在这里返回false,因为a 和b 具有不同的类型(a 具有类型[]byte,而b 具有类型[6]byte)和@987653 @。请改用b := make([]byte, len(a))。
  • DeepEqual 在比较字节时也不必要地繁重,因为它是基于反射的。只需使用bytes.Equal,这就是它的用途。
  • @Adrian 好点!

标签: unit-testing go


【解决方案1】:

reflect.DeepEqual(a, b) 返回 false,因为您正在比较两种类型。

var a = []byte("qwedsa") //here a is a slice with length 6

var b [6]byte //here b is a array with length 6

您可以使用不同的选项来执行此操作,如下所述。

  1. reflect.DeepEqual(a, b[:]) //by getting a slice from b array

  2. 使用它而不是反射包,因为反射不利于性能,正如Adrian 在他的评论中提到的那样

bytes.Equal(a, b[:])

  1. 如果不需要将b用作数组,则直接将b创建为长度为a的切片。
var b = make([]byte, len(a))
bytes.Equal(a, b)

【讨论】:

    【解决方案2】:

    这样做:

    package main
    import "bytes"
    
    func main() {
       var (
          a = []byte("qwedsa")
          b [6]byte
       )
       copy(b[:], a)
       println(bytes.Equal(a, b[:]))
    }
    

    https://golang.org/pkg/bytes#Equal

    【讨论】:

      【解决方案3】:

      根据您必须将 byte array 转换为 byte slice 并使用 bytes.Equal 的建议。以下是相同的实现:

      package main
      
      import (
          "bytes"
          "fmt"
      )
      
      func main() {
          var a = []byte("qwedsa")
          var b [6]byte
      
          sliceb := b[:]
          copy(sliceb, a)
          fmt.Println(bytes.Equal(a, sliceb))
      }
      

      输出:

      true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多