Что означает ноль в голанге?

Есть много случаев использования ноль в Голанге. Например:

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" указывает, что переменная не ссылается на экземпляр (эквивалент нулевого указателя в других языках)
  • Это нулевое значение переменных типа функции, карты, интерфейсы, каналы и структуры