2017-06-07 49 views
0

例として、 thisを参照して、ジョブの初期化と終了の間に定義済みの遅延を追加します。私はmapidにjobidとwaittimeというデータを保存しました。それから私は地図と同じ構造体型のチャンネルで地図全体をコピーしました。しかし、私は行くルーチン呼び出しでマップ値を取得することができません。私を助けてください、私は新しく行きます。Go langのstruct typeチャネルから値を取得できません

package main 

import "fmt" 

type Vertex struct { 
id, waitime int 
} 

var m = map[int]Vertex{ 
1: {1, 1000}, 
2: {2, 2000}, 
3: {3, 1000}, 
4: {4, 2000}, 
5: {5, 1000}, 
6: {6, 2000}, 
7: {7, 1000}, 
8: {8, 2000}, 
9: {9, 1000}, 
10: {10, 2000}, 
} 

func worker(w int, jobs <-chan Vertex, results chan<- int) { 
for j := 1; j <= len(m); j++ { 
    a, b := <-jobs.id, <-jobs.waitime 
    fmt.Println("worker", w, "started job", a) 
    //time.Sleep(time.Sleep(time.Duration(b))) 
    fmt.Println("worker", w, "finished job", a) 
    results <- j * 2 
    } 
} 

func main() { 
//n := 5 
jobs := make(chan Vertex, 100) 
results := make(chan int, 100) 

for w := 1; w <= 5; w++ { 
    go worker(w, jobs, results) 
} 
fmt.Println(len(m)) 
for j := 1; j <= len(m); j++ { 
    jobs <- m[j] 
} 
//close(jobs) 

for a := 1; a <= len(m); a++ { 
    <-results 
} 
} 

答えて

1

変更:

a, b := <-jobs.id, <-jobs.waitime 

へ:

job := <-jobs 
a, b := job.id, job.waitime 

jobsはチャネルではない頂点です。

3

あなたのコードにはいくつかの問題があります。

まず、チャンネルから直接structメンバーにアクセスすることはできません。つまり、この行は間違っている:

a, b := <-jobs.id, <-jobs.waitime 

jobsは、チャンネルです。 idまたはwaittimeというメンバーはありません。これらは構造体Vertexのメンバーです。この行を変更します。

job := <-jobs 
a, b := job.id, job.waitime 

しかし、今、あなたのコードはbを宣言し、それを使用していません。修正するには、time.Sleepへの呼び出しのコメントを解除:

time.Sleep(time.Sleep(time.Duration(b))) !INCORRECT CALL 

しかし、この呼び出しは完全に間違っています。 time.Sleepは、タイプtime.Durationの引数を受け取り、何も返しません。修正するには、次のように変更してください。

time.Sleep(time.Duration(b) * time.Millisecond) 

コードを実行する必要があります。

関連する問題