Если ошибка не равна нулю, зачем возвращать err и nil - PullRequest
0 голосов
/ 24 августа 2018

Я следую golang wiki инструкции и считаю, что это сбивает с толку:

func loadPage(title string) (*Page, error) {
    filename := title + ".txt"
    body, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    return &Page{Title: title, Body: body}, nil
}

Если err не равно nil, зачем возвращать nil?

Разве это не так?должно быть:

if err != nil {
    return err
}

, как это описано в Ошибки Голанга и значения ?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

В функции loadpage вы возвращаете два значения, одно - указатель на страницу, а другое - ошибку.

func loadPage(title string) (*Page, error) {
    filename := title + ".txt"
    body, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    return &Page{Title: title, Body: body}, nil
}

Это причина того, что в коде есть ошибка, и она не равна нулю. Затем верните ошибку. Но так как вам нужно вернуть Page также, он должен быть nil, поскольку это означает нулевое значение для указателя. Это показывает, что значение для Page пусто.

return &Page{Title: title, Body: body}, nil

Но если ошибки нет, вы снова возвращаете два значения, одно из которых является адресом структуры страницы со значениями, присвоенными полям страницы, но не равными ошибке.

Если значение типа не содержит никакого значения. Он должен быть инициализирован с нулевым значением, равным

false для логических значений, 0 для числовых типов, "" для строк и ноль для указатели, функции, интерфейсы, срезы, каналы и карты.

Возвращаемое значение или значения могут быть явно указаны в выражении «return». Каждое выражение должно быть однозначным и присваиваться соответствующему элементу типа результата функции.

func complexF1() (re float64, im float64) {
    return -7.0, -4.0
}

Список выражений в операторе «return» может быть одним вызовом многозначной функции. Эффект такой, как если бы каждое значение, возвращаемое из этой функции, было присвоено временной переменной с типом соответствующего значения, за которым следует оператор «return», перечисляющий эти переменные, после чего применяются правила предыдущего случая.

func complexF2() (re float64, im float64) {
    return complexF1()
}

Примечание:

Независимо от того, как они объявлены, все значения результата инициализируется нулевыми значениями для их типа при входе в функция. Оператор return, который указывает результаты, устанавливает результат параметры перед выполнением любых отложенных функций.

Посмотрите на спецификации Golang для Заявления о возврате

0 голосов
/ 24 августа 2018

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

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

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


Из-за ошибки верное значение не возвращается, поэтому мы возвращаем нулевое значение, которое в данном случае составляет nil (для значения указателя).

0 голосов
/ 24 августа 2018

Функция возвращает 2 вещи: страницу (указатель) и ошибку.Если возникает ошибка, страница не возвращается, поэтому первое возвращаемое значение - nil.Второе возвращаемое значение - это ошибка err, как и должно быть.

...