Что означает ноль в голанге?
Есть много случаев использования ноль в Голанге. Например:
func (u *URL) Parse(ref string) (*URL, error) {
refurl, err := Parse(ref)
if err != nil {
return nil, err
}
return u.ResolveReference(refurl), nil
}
но мы не можем использовать это так:
var str string //or var str int
str = nil
компилятор Голанга выбрасывает неиспользуемый can't use nil as type string in assignment
ошибке can't use nil as type string in assignment
.
Похоже, nil
можно использовать только для указателя структуры и интерфейса. Если это так, то что это значит? и когда мы используем его для сравнения с другим объектом, как они сравниваются, другими словами, как golang определяет, что один объект равен нулю?
РЕДАКТИРОВАТЬ: Например, если интерфейс равен нулю, его тип и значение должны быть равны нулю одновременно. Как Голанг делает это?
Ответы
Ответ 1
В Go nil
- это нулевое значение для указателей, интерфейсов, карт, срезов, каналов и типов функций, представляющее неинициализированное значение.
nil
не означает какое-либо состояние "undefined", это само по себе значение. Объектом в Go является nil
просто тогда и только тогда, когда оно равно nil
, которое может быть только в том случае, если оно относится к одному из вышеупомянутых типов.
An error
- это интерфейс, поэтому nil
является допустимым значением для одного, в отличие от a string
. По очевидным причинам ошибка nil
не представляет ошибки.
Ответ 2
nil
в Go является просто значением указателя NULL
для других языков.
Вы можете эффективно использовать его вместо любого указателя или интерфейса (интерфейсы - несколько указателей).
Вы можете использовать его как ошибку, потому что тип ошибки - это интерфейс.
Вы не можете использовать его как строку, потому что в Go строка является значением.
nil
не указывается в Go, то есть вы не можете этого сделать:
var n = nil
Потому что здесь вам не хватает типа n
. Однако вы можете сделать
var n *Foo = nil
Обратите внимание, что nil
является нулевым значением указателей и интерфейсов, неинициализированные указатели и интерфейсы будут nil
.
Ответ 3
- Для типов данных, таких как slice и указатели, которые "ссылаются" на другие типы, "nil" указывает, что переменная не ссылается на экземпляр (эквивалент нулевого указателя в других языках)
- Это нулевое значение переменных типа функции, карты, интерфейсы, каналы и структуры