Ответ 1
Простой ответ заключается в том, что nil
не определено как допустимое значение для типа string
в спецификации языка .
... но, возможно, вам нужен более длинный ответ?
nil
- это нулевое значение для указателей, интерфейсов, каналов, срезов, карт и типов функций, и оно представляет собой неинициализированное состояние.
Рассмотрим следующие объявления переменных:
var a *SomeType
var b interface{}
var c func()
Кажется естественным, что все эти переменные имели бы значение, которое представляет собой неинициализированное состояние. a
был объявлен как указатель, но на что он указывает, когда мы еще ничего не указали? nil
является очевидным нулевым значением для этих типов.
Что касается каналов, срезов и карт, их нулевое значение nil
по той простой причине, что их реализация такова, что они должны быть явно инициализированы до их использования. Это в основном по причинам производительности, все эти типы представлены внутри как более или менее сложные структуры данных, а их инициализация не является бесплатной.
Однако a string
не требует инициализации, и кажется естественным, что значение по умолчанию для нулевой строковой переменной будет пустой строкой, ""
. Поэтому просто нет причин для nil
быть допустимым строковым значением, и добавление его в спецификацию только сделает язык более сложным и гораздо более громоздким для работы.
Кроме того, что означает nil
типа string
? Пустая строка? У нас это уже есть. Неинициализированная строка? Нет такой вещи.