2014-04-19 14 views
10

aşağıdaki kukla kodu kullanarak tipi iddiasıyla oynuyorum ve ben hata var anahtarı yazamaz?Golang:</p> <blockquote> <p>cannot type switch on non-interface value</p> </blockquote> <p>bilen var mı bu ne demek: olmayan arayüz değeri

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

ancak bilinen bir tipte tip iddiası yapma noktası ne olurdu? – newacct

+0

@newacct Evet, üretim kodunda, tür zaten biliniyorsa kesinlikle bir tür onaylama yapmazsınız. Bu egzersizin amacı tip iddiasını anlamaktır. – Mingyu

cevap

14

Tip anahtarları kendi içimize bakmak için bir arayüz gerektirir. Bilinen bir değere aktarırsanız, bombalar. Eğer bir parametre olarak bir arayüz kabul eden bir işlevi yaparsanız, bu iş olacak:

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

burada tam kod http://play.golang.org/p/QNyf0eG71_ ve arayüzleri http://golang.org/doc/effective_go.html#interfaces üzerine golang belgelerine bakın.

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

Teşekkürler, @ dethtron5000. Eksik olduğum şey, "tip iddiası" ndan önce "interface {}" için açık bir atım yapılması gerektiğidir. – Mingyu

+0

Bu cevap bana çok yardımcı oldu. Yapı tiplerinin anahtarları ile biraz daha karmaşık bir durum çözüyorum, ama bu beni aşağı yönde itti. Teşekkür ederim dostum. Sadece bunu söylemek için giriş yaptım) – Altenrion

+0

Bu cevap bana çok yardımcı oldu. Yapı tiplerinin anahtarları ile biraz daha karmaşık bir durum çözüyorum, ama bu beni aşağı yönde itti. Teşekkür ederim dostum. Sadece bunu söylemek için giriş yaptım) – Altenrion

13

Ben tip iddianın önce interface{} için n döküm etmektir cevabı, anladım. Bir tür dönüşüm yapıyorsunuz.

+0

Bu kodun gerçek hayatta kullanılması için hiçbir sebep olmayacaktır, çünkü herhangi bir arabirim dışı değişken (yani, 'n') zaten kaynak kodunuzda değişemeyen bilinen bir türe sahiptir. Örneğin, int olarak bildirilirse, bunun bir int olduğunu biliyorsunuzdur. – thomasrutter

0

Go hiçbir tipleştiriyor vardır:

İlgili konular