For Go builtins, nil and empty read the same
Jack Lindamood

Range also works correctly with nil slices and maps (i.e. it just exits the block immediately). Range over a nil channel blocks forever, which is a little unfortunate, but is at least consistent with receiving on a nil channel, and is necessary to make select work correctly.