Почему `fmt.Println ("% T \ n ", e)` где `e` - переменная ошибки, выводит <nil>, а не ее тип? - PullRequest
0 голосов
/ 30 января 2019

Я недавно играл с языком Go и столкнулся с чем-то немного странным, если не сказать больше, давайте рассмотрим очень простую функцию:

func main() {
    n, e := fmt.Println(`He said: "Hello"`)
    fmt.Printf("%T\n", n)
}

, которая выводит то, что я ожидал:

He said: "Hello"
int

Теперь, если я хочу отобразить тип e:

func main() {
    n, e := fmt.Println(`He said: "Hello"`)
    fmt.Printf("%T\n", e)
}

, и на этот раз выдается:

He said: "Hello"
<nil>

Я получаю часть, которая естьнет ошибки, поэтому e - пустой указатель: nil, но я не ожидал, что сам по себе ~~ type ~~.

Почему я не получаюфактический тип?

Если это так, есть ли обходной путь?(я не говорю, что мой вариант использования реалистичен, но любопытно, есть ли такая возможность)

Ответы [ 2 ]

0 голосов
/ 30 января 2019

e - пустой указатель

Нет, error сам по себе - интерфейс, поэтому здесь у вас не будет типа.

0 голосов
/ 30 января 2019

Спецификация языка программирования Go

Ошибки

Ошибка предварительно объявленного типа определяется как

type error interface {
  Error() string
}

Это обычный интерфейс для представления состояния ошибки, при этом значение nil не представляет ошибки.

Типы интерфейса

Тип интерфейса определяет набор методов, называемый егоинтерфейс.Переменная типа интерфейса может хранить значение любого типа с набором методов, который является любым надмножеством интерфейса.Говорят, что такой тип реализует интерфейс.Значение неинициализированной переменной типа интерфейса равно nil.

Нулевое значение

Когда для переменной выделено хранилище, либо через объявление, либо через вызов newили когда создается новое значение с помощью составного литерала или вызова make, и явная инициализация не предоставляется, переменной или значению присваивается значение по умолчанию.Для каждого элемента такой переменной или значения устанавливается нулевое значение для его типа: nil для интерфейсов.


Тип с нулевым значением error, интерфейс, не имеет типа.Его значение nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...