2013-04-02 14 views
10

Idź narzeka na tworzenie instancji w instrukcji if. Czemu? Czy jest w tym poprawna składnia, która nie zawiera zmiennych tymczasowych lub nowych funkcji?Dlaczego tworzenie struktury w instrukcji if jest nielegalne w Go?

type Auth struct { 
    Username string 
    Password string 
} 

func main() { 
    auth := Auth { Username : "abc", Password : "123" } 

    if auth == Auth {Username: "abc", Password: "123"} { 
     fmt.Println(auth) 
    } 
} 

Error (po if-oświadczenie linia): błąd składni: niespodziewany: oczekując: = lub = lub przecinek

Daje to ten sam błąd:

if auth2 := Auth {Username: "abc", Password: "123"}; auth == auth2 { 
      fmt.Println(auth) 
} 

To działa jak oczekiwano:

auth2 := Auth {Username: "abc", Password: "123"}; 
if auth == auth2 { 
     fmt.Println(auth) 
} 

Odpowiedz

19

Musisz okrążyć prawą stronę == za pomocą nawiasów. W przeciwnym razie idź pomyśli, że "{" jest początkiem bloku "jeśli". Poniższy kod działa poprawnie:

package main 

import "fmt" 

type Auth struct { 
    Username string 
    Password string 
} 

func main() { 
    auth := Auth { Username : "abc", Password : "123" } 
    if auth == (Auth {Username: "abc", Password: "123"}) { 
     fmt.Println(auth) 
    } 
} 

// Output: {abc 123} 
+8

kompletności boską: „To parsowania dwuznaczność powstaje, gdy pojawi się kompozyt dosłowny za pomocą formularza TypeName z LiteralType pomiędzy kluczowym i nawiasu otwierającego blokowy«jeśli», Instrukcja "dla" lub "przełączania", ponieważ nawiasy otaczające wyrażenia w dosłownym są mylone z tymi, które wprowadzają blok instrukcji. Aby rozwiązać niejednoznaczność w tym rzadkim przypadku, literał złożony musi pojawić się w nawiasach. " - http://golang.org/ref/spec – mna

Powiązane problemy