Sobes.tech
Junior — Middle

Mi a különbség a üres interfész kifejezés és a nil érték között a Go nyelvben?

sobes.tech MI

Válasz az MI-től

A Go nyelvben a üres interfész (interface{}) egy olyan típus, amely bármilyen típusú értéket tartalmazhat, beleértve a nil-t is. Azonban az üres interfész kifejezése és a nil érték két külön dolog.

  • var x interface{} — egy x nevű változó, amely az üres interfész típusába tartozik, és alapértelmezés szerint nil, azaz nem tartalmaz sem típus, sem érték adatokat.
  • De ha értéket rendelünk hozzá, például x = 5, akkor x már nem nil, mert tartalmazza az int típusú értéket és a 5-öt.

A különbség abban rejlik, hogy a Go-ban az interfész belsőleg két mutatóval van reprezentálva: egy a típusra és egy az értékre. Az interfész csak akkor egyenlő a nil-lal, ha mindkét mutató nil.

Példa:

var i interface{} // i == nil
var p *int = nil

 i = p // i nem `nil`, mert a típus *int jelen van, még akkor is, ha az érték `nil`

fmt.Println(i == nil) // hamis

Tehát az üres interfész tartalmazhat nil értéket egy adott típusból, de maga az interfész nem lesz nil. Ez egy fontos pont a nil ellenőrzéseknél Go-ban.