For those Gophers reading this and sobbing silently, there may be hope: https://github.com/golang/go/issues/27589
The very idea of allowing the nil value for slices seems to be very strange and inconsistent, as slices are struct types, not pointer types in Go (they contain a pointer and other members). Just one of the many ways that builtin types in Go are fundamentally different from user-creatable types, I guess...
For context, we recently had a bug where backend forgot to initialize their map, so they were sending us a null where we expected an object, and it would have gone undetected for much longer if the JSON didn't contain a literal null there.
(And all Go zero values are exactly what you get with the relevant RAM filled with the zero byte.)
var x []int;
y := []int{};
Both produce a slice of capacity zero, except `x` serializes to null and `y` serializes to an empty array.