2014-04-28 10 views
5

Rozważmy następujący fragment: GoUżywaj idiomu "przecinek" lub wskaźnika powrotu?

func sheep() (int, bool) { 
    return 1, true 
} 

func main() { 
    if dolly, ok := sheep() { 
     //do something 
    } 
} 

Jak czytam na 'Effective Go' ten nazywany jest 'przecinek ok' idiom. O ile wiem, to jest używane do odróżnienia od rzeczy "znalezionej" i "nie znalezionej".

To samo można osiągnąć poprzez:

type Sheep struct {} 

func sheep() *Sheep { 
    return &Sheep{} 
} 

func main() { 
    if dolly := sheep(); dolly != nil { 
     //do something 
    } 
} 

Ten ostatni przykład wydaje się spełniać ten sam cel, a może nawet ładniejszy. W przykładzie "przecinek" przypisanie jest poprawne tylko w bloku if.

Być może brakuje mi pewnych rozważań. Który wzór jest preferowany? I dlaczego?

Krótki przykład: http://play.golang.org/p/ATxvle38iE

+0

Drugim przykładem jest nieprawidłowy iść – fabrizioM

+0

Dobrze punktowane. Poprawiłem to. – harm

Odpowiedz

5

W aplikacji Go wartość o wartości nil może być bardzo dobra. Na przykład, zerowy plaster działa (prawie) jak pusty plaster, a to samo może dotyczyć zdefiniowanych przez użytkownika odbiorników wskaźnika.

Z tego powodu zazwyczaj preferowany jest idiom comma-ok lub comma-error, ponieważ oczywiste jest, że osoba wywołująca funkcję musi jawnie potraktować przypadek błędu (lub not-ok).

Tak, są idiomatyczne, gdy wartość Sheep zwrot nie może być ważne:

func sheep() (*Sheep, bool) {...} 
func sheep() (s *Sheep, ok bool) {...} // Adding names to make it clearer 
func sheep() (*Sheep, error) {...} 

I to jest idiomatyczne tylko wtedy, gdy wartość zwracana jest zawsze aktualne:

func sheep() *Sheep {...} 

Jest to obszar gdzie Go różni się od innych języków, gdzie zerowa wartość zwracana może być użyta do sygnalizowania błędu. Idiomy "idź" przecinku i błędu przecinkowego dobrze radzą sobie z "pomyłką miliardów dolarów" zerowych wskaźników, ponieważ kod, który nie zajmuje się nieprawidłowymi wartościami zwracanymi, wygląda źle. Jeśli piszesz kod idiomatyczne, można od razu zobaczyć, gdy błędy są ignorowane: na przykład przypisanie do s2 tutaj natychmiast wyskakuje jako podejrzane:

s1 := sheep() 
s2, _ := sheep() 
6

Oba są dopuszczalne, plus przegapiłeś najczęściej idiom; Wracając value, error.

Idiom "comma ok", o którym mowa w "Effective Go", jest zwykle zarezerwowany dla wbudowanych operacji, takich jak czytanie z mapy lub kanału oraz dla asercji typu.

Użyłbym go, jeśli chcesz zwrócić wartość, w której wskaźnik byłby niepotrzebny, niewygodny lub gdy zero jest poprawną wartością; ale w zależności od sytuacji value, error może być równie dobry.

+0

Dlaczego oprócz "comma err" wprowadzono "przecinek w porządku"? Wygląda na to, że straciłeś szansę na konsekwencję, więc sądzę, że jest jakiś dobry powód. – akim

Powiązane problemy