Checking equality of interface{}

本小妞迷上赌 提交于 2019-12-03 05:01:34
Brian Vanover

Thanks to @CodingPickle comment, I provide the following from the Go Programming Language Specification

The equality operators == and != apply to operands that are comparable.

Regarding interface{}s and structs:

  • Interface values are comparable. Two interface values are equal if they have identical dynamic types and equal dynamic values or if both have value nil.
  • A value x of non-interface type X and a value t of interface type T are comparable when values of type X are comparable and X implements T. They are equal if t's dynamic type is identical to X and t's dynamic value is equal to x.
  • Struct values are comparable if all their fields are comparable. Two struct values are equal if their corresponding non-blank fields are equal.

You can also try this playground https://play.golang.org/p/bgO1_V87v9k

In other words, handling equality seems easy in Go!

Update: since the above question and answers were written the Go language has changed slightly.

Previously if two interfaces are compared and either or both contained a non-comparable type then the run-time would panic. Now the runtime will only panic if they both contain the same non-comparable type. (If they contain different types then the result is now false even if either type is non-comparable.)

What are non-comparable types? Basically, they are slices, maps, functions and any struct or array type that uses them.

AFAIK this was a silent change around Go 1.9 or 1.10.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!