SORU
12 Ocak 2013, CUMARTESİ


Veri ({} yazın arayüzü) dönüştürmek için dize türü: tür iddia gerek

Gitmek için oldukça yeni ve ben notify Bu paket ile oynuyordum.

İlk başta buna benzeyen bir kod vardı:

func doit(w http.ResponseWriter, r *http.Request) {
    notify.Post("my_event", "Hello World!")
    fmt.Fprint(w, " OK")
}

Bu oldukça önemsiz olacaktır, çünkü işlevi Hello World! ama yeni satır ekleme doit yukarıdaki istedim, ama handler sonra aşağıda bu gibi:

func handler(w http.ResponseWriter, r *http.Request) {
    myEventChan := make(chan interface{})
    notify.Start("my_event", myEventChan)
    data := <-myEventChan
    fmt.Fprint(w, data   "\n")
}

go run sonra:

$ go run lp.go 
# command-line-arguments
./lp.go:15: invalid operation: data   "\n" (mismatched types interface {} and string)

Google'da biraz sonra this question on SO buldum.

O zaman benim kod güncelleme:

func handler(w http.ResponseWriter, r *http.Request) {
    myEventChan := make(chan interface{})
    notify.Start("my_event", myEventChan)
    data := <-myEventChan
    s:= data.(string)   "\n"
    fmt.Fprint(w, s)
}

Yapmam gereken şey bu mu? Derleyici hataları oldukça iyi, sanırım bu yüzden gitti? Bu verimli mi? Farklı bir şekilde mi yapmalısın?

CEVAP
12 Ocak 2013, CUMARTESİ


Go specification göre:

Bir ifade için arabirim tipi x ve T türü, birincil ifade x.(T) x değil nil ve x değeri içinde saklı tipi T. olduğunu ileri sürüyor

Bir "tür" iddiası, sana bir arabirim değeri belli somut bir türü içeren veya beton türü bir arayüz karşılayacak bildirebilirsiniz.

Örnek, veri iddia ediyordunuz ({} yazın arayüzü) beton türü dize vardır. Eğer yanlış ise, program çalışma anında panik olur. Verimlilik konusunda endişelenmenize gerek yok, sadece kontrol ediyordum iki işaretçi değerleri karşılaştırarak gerektirir.

Eğer bir dize olup olmadığından emin olsaydın, iki dönüş sözdizimini kullanarak test edebilirsin.

str, ok := data.(string)

Eğer veri bir dize değil, Tamam yanlış olacaktır. Yani o zaman bir if içine böyle bir açıklama sarmak için ortak:

if str, ok := data.(string); ok {
    /* act on str */
} else {
    /* not string */
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • jedimasterkyle

    jedimasterky

    11 ŞUBAT 2006
  • LearnKey

    LearnKey

    19 AĞUSTOS 2008