如何在Go中打印数组项的类型?

时间:2015-09-18 13:21:14

标签: unit-testing go

当我尝试对一些代码进行单元测试时,我有一些这样的断言:

expected := []interface{}{1}
actual := []interface{}{float64(1)}

if !reflect.DeepEqual(expected, actual); {
    t.Errorf("Expected <%T> %#v to equal <%T> %#v", actual, actual, expected, expected);
}

得到了这个输出:

Expected <[]interface {}> []interface {}{1} to equal <[]interface {}> []interface {}{1}

如何打印此邮件更明确?

谢谢!

see this code in play.golang.org

1 个答案:

答案 0 :(得分:2)

您正在打印切片的类型,而不是元素的类型。切片的类型为[]interface{}。这就是你看到它的原因。

如果你想看到元素的动态类型(它们的静态类型总是interface{}),那么打印元素的类型:

fmt.Printf("Expected element type: %T, got: %T", expected[0], actual[0])

将输出:

Expected element type: int, got: float64

注意:

上面的代码假设您将2个切片与1个元素进行比较。如果您不想检查切片长度并且想要处理任何长度的切片,则可以使用其他动词。例如,您可以使用需要%t值的bool动词,并希望打印truefalse。请注意,这只是一个实现决策,并不能保证,但例如使用%t将打印所有切片元素;如果类型为bool,则打印相应的bool值,如果该值不是bool类型,则将打印该元素的动态类型和值。

示例:

data := []interface{}{1, float64(2), "3", time.Now()}
fmt.Printf("%t", data)

输出:

[%!t(int=1) %!t(float64=2) %!t(string=3)
    {%!t(int64=63393490800) %!t(int32=0) %!t(*time.Location=&{ [] [] 0 0 <nil>})}]

它有点难看,但包含许多有用的信息(例如类型,值)。