2016-03-20 9 views
0

この関数では、goキーワードを使用していることがわかります。goキーワードを使用しないと、関数が機能しません。

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-- 
    } 

} 

これは機能します。それは私に最大の整数を与えます。しかし、今、私は好奇心旺盛取得し、私はちょうど

findGreatestDivisor(4,c) 

を行い、それは私にエラーを与えたとき、私はここに

go findGreatestDivisor(4,c) 

を関数を呼び出し、外出先のキーワードを削除

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 

それはなぜですか? The Go Programming Language Specification

Send statements

答えて

2

送信文は、チャネル上の値を送信します。チャネル式 はチャネルタイプでなければならず、チャネル方向は送信 の操作を許可しなければならず、送信する値のタイプはチャネルの要素タイプ に割り当てる必要があります。 通信が始まる前

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

チャネルと値式の両方が評価されます。送信が進むまでの通信ブロック。 受信機の準備が整っていれば、バッファされていないチャネルでの送信を続けることができます。バッファに空きがある場合は、バッファされたチャネルで送信する を続行できます。 クローズドチャネルでの送信は、実行時パニックを引き起こします。 は、無制限のチャネルを永久にブロックします。

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

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

findGreatestDivisorでは、送信が続行できるようになるまでバッファリングされていないチャンネルc

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

が、通信ブロック上で送信してみてください。受信機が準備が整っていれば、バッファされていないチャンネルのセンドを進めることができます。受信機は準備ができていません。あなたはfindGreatestDivisorから復帰後まで

ザ・はc

fmt.Println(<-c) 

チャンネルで受信の準備ができません。それは遅すぎる。

+0

Ok peter!どうもありがとう!あなたのベスト – Jon

関連する問題