Не удалось получить значения из канала типа структуры в Go lang

Со ссылкой на этот пример, я хочу добавить заранее определенную задержку между инициализацией и завершением задания. Я сохранил данные, т. Е. Jobid и время ожидания в карте. Затем я скопировал всю карту в канал того же типа структуры, что и карта. Но я не могу получить значения карты в обычных вызовах. Пожалуйста, помогите мне, я новичок в Go.

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

2 ответа

Несколько вещей не так с вашим кодом.

Во-первых, вы не можете получить доступ к членам структуры напрямую из канала. То есть эта строка неверна:

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)

Это должно запустить ваш код.

Изменить:

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

чтобы:

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

jobs это канал, а не вершина.

Другие вопросы по тегам