nil slices vs non-nil slices vs empty slices in Go language

Viewed 20203

I am a newbie to Go programming. I have read in go programming book that slice consists of three things: a pointer to an array, length and capacity.

I am getting confused between:

  • nil slices (slice has no underlying array to point to, len = 0, cap=0)
  • non-nil slices where only len = 0, cap = 0
  • empty slices.

Can anyone please tell whether nil and empty slices are same things? If they both are different, then please tell what is the difference between those two? How to test whether a slice is empty or not? Also, what value does the pointer holds in non-nil slices, whose length and capacity are zero?

3 Answers
var s1 []int         // nil slice
s2 := []int{}        // non-nil, empty slice
s3 := make([]int, 0) // non-nil, empty slice

warning, if dealing with JSON, a nil slice will encode to null instead of [], which can break some (javascript) clients that try to iterate (without a null check) over null which isn't iterable.

Related