2016-03-20 23 views
0

Bu işlevde, go anahtar sözcüğünü kullandığımı görebilirsiniz.Git anahtar sözcüğünü kullanmadığımda bir işlev çalışmıyor

package main 

import (
    "fmt" 
    "math" 
) 

func main() { 
    c := make(chan string) 
    go findGreatestDivisor(4, c) 
    for i := 0; i <= 1; i++ { 
     fmt.Println(<-c) 
    } 
} 

func findGreatestDivisor(num float64, c chan string) { 
    var counter float64 = 10000 
    for i := 9999; i > 0; i-- { 
     if math.Mod(num, counter) == 0 { 
      fmt.Println("Check..", math.Mod(4, 1)) 
      c <- fmt.Sprintf("%f is divisble by %d", num, i) 
     } 
     counter-- 
    } 

} 

Çalışıyor. Bana en büyük tamsayıyı veriyor. Ama şimdi merak almak ve burada işlev

go findGreatestDivisor(4,c) 

ben sadece

findGreatestDivisor(4,c) 

yaptığınızda bana hata

fatal error: all goroutines are asleep - deadlock! 

goroutine 1 [chan send]: main.findGreatestDivisor(0x4010000000000000, 
0xc82001a0c0) 
     /home/ubuntu/workspace/test.go:21 +0x37c main.main() 
     /home/ubuntu/workspace/test.go:10 +0x61 exit status 2 

o neden verir denilen gitmek anahtar kelimeyi silmek? The Go Programming Language Specification

Send statements

cevap

2

bir ifadesi göndermek bir kanalda bir değeri gönderir. Kanal ifadesi kanal tipinde olmalıdır, kanal yönü işlemlerini göndermelidir ve gönderilecek değerin türü kanalın eleman tipine atanabilir olmalıdır. iletişim başlamadan önce

SendStmt = Channel "<-" Expression . 
Channel = Expression . 

kanal ve değer ifade Hem değerlendirilir. Gönderme işlemi devam edene kadar iletişim blokları. Bir alıcı hazırsa, arabelleğe alınmamış bir kanaldaki bir gönderim işlemi devam edebilir. Tamponda bir oda varsa, tamponlanmış bir kanal üzerinde bir gönderebilirsiniz. Kapalı bir kanaldaki bir gönderim, çalışma zamanı paniğine neden olarak devam eder. Bir sonsuza kadar bir nil kanal blokları gönderir.

ch <- 3 // send value 3 to channel ch 

c := make(chan string) 
findGreatestDivisor(4,c) 

findGreatestDivisor size gönderme devam edebilirsiniz kadar tamponsuz kanalda c

c <- fmt.Sprintf("%f is divisble by %d", num, i) 

ancak haberleşme blokları üzerinde göndermeyi deneyin. Bir alıcı hazırsa, arabelleğe alınmamış bir kanaldaki bir gönderme işlemi devam edebilir. Hazır bir alıcı yok.

Eğer findGreatestDivisor dönmek sonrasına kadar hazır olmayacak kanalın c

fmt.Println(<-c) 

üzerine alır. Artık çok geç.

+0

Tamam peter! Çok teşekkürler! En iyisi – Jon

İlgili konular