Nil slice — zero value, no backing array. Empty slice — has backing array but no elements.
Both support len, cap, range, and append identically. The difference shows in JSON and equality.
1var nilS []int2emptyS := []int{}3madeS := make([]int, 0, 5)45fmt.Println(nilS == nil) // true6fmt.Println(emptyS == nil) // false7fmt.Println(madeS == nil) // false
JSON:
1n, _ := json.Marshal(nilS) // "null"2e, _ := json.Marshal(emptyS) // "[]"
When to use:
[].Common mistakes:
len == 0.append(nilSlice, ...) is safe.slices.Equal(nilS, emptyS) returns false.