Спецификация языка Go описывает несколько встроенных предопределенных идентификаторов, которые не следует использовать в качестве имен в программах Go.
В зависимости от контекста, повторное использование этих идентификаторов в качестве имен либо затеняет оригинал в текущей лексической области (и любых вложенных областях), либо делает затронутый код сбивающим с толку. В лучшем случае компилятор пожалуется; в худшем случае такой код может привести к скрытым ошибкам, которые трудно обнаружить с помощью поиска.
Неудачный вариант:
var error string
// `error` затеняет встроенный идентификатор
// или
func handleErrorMessage(error string) {
// `error` затеняет встроенный идентификатор
}
Более удачный вариант:
var errorMessage string
// `error` относится к встроенному идентификатору
// или
func handleErrorMessage(msg string) {
// `error` относится к встроенному идентификатору
}
Неудачный вариант:
type Foo struct {
// Хотя эти поля технически не
// составляют затенение, поиск для
// строк `error` или` string` теперь
// неоднозначен.
error error
string string
}
func (f Foo) Error() error {
// `error` и` f.error`
// визуально похожи
return f.error
}
func (f Foo) String() string {
// `string` и` f.string`
// визуально похожи
return f.string
}
Более удачный вариант:
type Foo struct {
// Строки `error` и` string`
// теперь однозначны.
err error
str string
}
func (f Foo) Error() error {
return f.err
}
func (f Foo) String() string {
return f.str
}
Обратите внимание, что компилятор не будет генерировать ошибки при использовании предопределенных идентификаторов, но такие инструменты, как go vet, должны правильно указывать на эти и другие случаи затенения.
Читайте также:
- Go style guides: не используйте panic
- Go style guides: избегайте встраивания типов в общедоступные структуры
- Go style guides: обертывание ошибок, обработка ошибок утверждения типа
Комментариев нет:
Отправить комментарий