Поиск…


объяснение

Нулевые значения или нулевая инициализация просты в реализации. Исходя из таких языков, как Java, может показаться сложным, что некоторые значения могут быть nil а другие - нет. В резюме из Zero Value: язык программирования Go Go Спецификация :

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

Если функции, которые проверяют какое-либо условие, могут возникнуть проблемы:

func isAlive() bool {
    //Not implemented yet
    return false
}

Нулевое значение будет ложным еще до реализации. Единичные тесты, зависящие от возврата этой функции, могут давать ложные срабатывания / негативы.

Типичным обходным путем является также возврат ошибки, которая является идиоматической в ​​Go:

package main

import "fmt"

func isAlive() (bool, error) {
    //Not implemented yet
    return false, fmt.Errorf("Not implemented yet")
}

func main() {
    _, err := isAlive()
    if err != nil {
        fmt.Printf("ERR: %s\n", err.Error())
    }
    
}

играть на детской площадке

При возврате как структуры, так и ошибки вам нужна структура User для возврата, которая не очень элегантна. Есть два варианта:

  • Работа с интерфейсами: возврат nil путем возврата интерфейса.
  • Работа с указателями: указатель может быть nil

Например, следующий код возвращает указатель:

func(d *DB) GetUser(id uint64) (*User, error) {
    //Some error ocurred
    return nil, err
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow