Golang връща нула

Опитвам се да се запозная с типовете и интерфейсите на Golang, но малко се боря да го направя. Както и да е, често срещан модел, който виждам, е func Whatever() (thing string, err error). Разбирам как работи всичко това, но единственото нещо, което ме обърква, е защо е добре да return "thing", nil. Конкретният екземпляр, който разглеждам, е в забавление тук-

func (c *GorpController) Begin() revel.Result {
    txn, err := Dbm.Begin()
    if err != nil {
        panic(err)
    }
    c.Txn = txn
    return nil
}

revel.Result е интерфейс с този подпис-

type Result interface {
    Apply(req *Request, resp *Response)
}

Както и да е, просто съм любопитен как връщането на nil удовлетворява компилатора в този случай. Има ли ресурс, към който мога да бъда посочен за това?


person Brandon Hansen    schedule 11.11.2014    source източник


Отговори (1)


Това е подобно на връщането на нулева грешка: вижте Защо моята нулева стойност на грешка не е равна на нула?

Под капаците интерфейсите са реализирани като два елемента, тип и стойност.

Стойността, наречена динамична стойност на интерфейса, е произволна конкретна стойност и типът е този на стойността. За int стойността 3 стойността на интерфейса съдържа схематично (int, 3).

Интерфейсна стойност е nil само ако и вътрешната стойност, и типът не са зададени (nil, nil). По-специално, интерфейс nil винаги ще съдържа тип nil.
Ако съхраняваме указател от тип *int в стойност на интерфейс, вътрешният тип ще бъде *int независимо от стойността на указателя: (*int, nil).
Такава интерфейсна стойност следователно ще бъде non-nil дори когато указателят вътре е nil.

Тук nil е нулевата стойност на интерфейса revel.Result.

person VonC    schedule 11.11.2014
comment
Перфектно обяснение. Благодаря много за това. Go е един от онези езици, които са едновременно най-лесните и най-трудните езици, които съм учил. - person Brandon Hansen; 12.11.2014