为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕斯709654 2021-11-08 16:09:27
当我尝试对一些代码进行单元测试时,我有一些这样的断言: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}如何打印此消息以更明确?
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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


如果要查看元素的动态类型(它们的静态类型始终为interface{}),则打印元素的类型:


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

这将输出:


Expected element type: int, got: float64

笔记:


上面的代码假设您将 2 个切片与 1 个元素进行比较。如果不想检查切片长度,而想处理任意长度的切片,则可以使用其他动词。例如,您可以使用%t需要bool值并希望打印的动词true或false。请注意,这只是一个实现决定,并不能保证,但%t例如使用将打印所有切片元素;bool如果是 type 则打印相应的值,如果不是 typebool则打印元素的动态类型和值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>})}]

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


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 789 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信