Les structures ne peuvent pas être nul, mais c'est de la compilation

Je suis en train de jouer avec aire de Jeux et trouver ce code:

package main

import (
    "fmt"
    "time"
)

type MyError struct {
    When time.Time
    What string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("at %v, %s",
        e.When, e.What)
}

func run() error {
    return &MyError{
        time.Now(),
        "it didn't work",
    }
}

func main() {
    if err := run(); err != nil {
        fmt.Println(err)
    }
}

Donc ici, je peux voir que *MyError implémente error interface. Cependant, si je retire & dans error func et retour MyError au lieu de cela, je reçois erreur de compilation:
prog.go:19: cannot use MyError literal (type MyError) as type error in return argument: MyError does not implement error (Error method has pointer receiver). OK je peux comprendre que, si je peux rendre la fonction Error comme ça et ce sera de compiler et d'exécuter avec succès:

func (e MyError) Error() string {
    return fmt.Sprintf("at %v, %s",
        e.When, e.What)
}

func run() error {
    return MyError{
        time.Now(),
        "it didn't work",
    }
}

Puis-je voir dans main func qu'il y est de vérifier si err est nil donc, si je comprends bien, il est parfaitement possible func error de retour nil dans certaines situations. Il est donc possible pour MyError struct prendre nil valeurs. Mais alors, si j'essaie de compiler ce:

import (
    "fmt"
    "time"
)

type MyError struct {
    When time.Time
    What string
}

func (e MyError) Error() string {
    return fmt.Sprintf("at %v, %s",
        e.When, e.What)
}

func run() error {
    return nil
    return MyError{
        time.Now(),
        "it didn't work",
    }
}

func main() {
    var err2 MyError = nil

    fmt.Println(err2)
    if err := run(); err != nil {
        fmt.Println(err)
    }
}

aller compilateur dit qu': prog.go:27: cannot use nil as type MyError in assignment
[process exited with non-zero status]

Pourquoi dans la partie supérieure de cas, la compilation est réussie, et dans ce cas, la compilation échoue?
Est-il possible pour les structures à nil (je suppose que non, mais alors pourquoi run func compile?)

InformationsquelleAutor Mariy | 2014-06-28