2014-04-19 14 views
10

gram z typu twierdzenia za pomocą następującego kodu obojętne, i mam błąd:Golang: nie można wpisać przełącznik na wartość różną od interfejsu

cannot type switch on non-interface value

Czy ktoś wie co to znaczy?

package main 

import "fmt" 
import "strconv" 

type Stringer interface { 
    String() string 
} 

type Number struct { 
    v int 
} 

func (number *Number) String() string { 
    return strconv.Itoa(number.v) 
} 

func main() { 
    n := &Number{1} 
    switch v := n.(type) { 
    case Stringer: 
     fmt.Println("Stringer:", v) 
    default: 
     fmt.Println("Unknown") 
    } 
} 

http://play.golang.org/p/Ti4FG0m1mc

+0

, ale jaki byłby sens tworzenia asercji typu na znanym typie? – newacct

+0

@newacct Tak, w kodzie produkcyjnym na pewno nie wpisujesz asercji, jeśli typ jest już znany. Celem tego ćwiczenia jest zrozumienie asercji typu. – Mingyu

Odpowiedz

14

przełączniki typu wymagają interfejsu do introspekcji. Jeśli przekazujesz mu wartość znanego typu, bombarduje. Jeśli się funkcję, która akceptuje interfejsu jako parametr, to będzie działać:

func typeSwitch(tst interface{}) { 
    switch v := tst.(type) { 
     case Stringer: 
      fmt.Println("Stringer:", v) 
     default: 
      fmt.Println("Unknown") 
    } 
} 

Zobacz pełny kod tutaj http://play.golang.org/p/QNyf0eG71_ oraz dokumentacji golang na interfejsach http://golang.org/doc/effective_go.html#interfaces.

+0

Dzięki, @ dethtron5000. To czego mi brakowało to to, że przed "asercją typu" wymagana jest jawna obsada dla 'interface {}'. – Mingyu

+0

Ta odpowiedź bardzo mi pomogła. Rozwiązuję nieco bardziej skomplikowaną sytuację z przełącznikami typów konstrukcji, ale to popchnęło mnie w kierunku wright. Dziękuje. Zalogowałem się, żeby ci to powiedzieć) – Altenrion

+0

Ta odpowiedź bardzo mi pomogła. Rozwiązuję bardziej skomplikowaną sytuację z przełącznikami typów konstrukcji, ale to popchnęło mnie w kierunku wright. Dziękuje. Zalogowany, aby ci to powiedzieć) – Altenrion

13

zorientowali się odpowiedź, która jest rzucić n do interface{} przed stwierdzeniem typu:

switch v := interface{}(n).(type) 
+0

Nie ma powodu, aby używać tego kodu w prawdziwym życiu, ponieważ każda zmienna nieinterfejsowa (tj. 'N') ma już znany typ w kodzie źródłowym, który nie może się zmienić. Np. Jeśli jest zadeklarowany jako int, to wiesz, że to int. – thomasrutter

0

Brak typecasts w Go. Dokonujesz konwersji typu.

Powiązane problemy