https://play.golang.org/p/hpUyYKkkx9

a := []int{}
b := [...]int{}
c := []int(nil)
var d []int

上記の変数a~dはいずれも「要素数0のint型配列」を表していますが、reflect.DeepEqualで比較してみると、すべてが同じ値というわけではないように見えました。

[]int[0]int型が区別されるのは(SliceとArrayの違いなので)ぼんやりと理解できますが、そうすると同じ型のはずの[]int{}[]int(nil)(ac)が区別されるのが腑に落ちません。

これらの型はどう区別、比較すればいいのでしょうか?

例えば、配列を返す関数をテストしたい場合に、返り値が空配列となるケースをどのようにテストすればいいのか知りたいです。