英文:
not able to fetch values from struct type channel in Go lang
问题
参考此示例,我想在作业初始化和终止之间添加预定义的延迟。我已经将数据(即jobid和waittime)存储在map中。然后,我将整个map复制到与map相同结构类型的通道中。但是我无法在Go例程调用中获取map的值。请帮助我,我是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
}
}
英文:
With reference to this example, i want to add a pre-defined delay between job initialization and termination. I have stored the data i.e. jobid and waittime in map. Then i have copied the entire map in a channel of same struct type as map. But i am not able to fetch the map values in go routine calls. Please help me, I am new to 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
}
}
答案1
得分: 5
你的代码有几个问题。
首先,你不能直接从通道中访问结构体成员。也就是说,这一行是错误的:
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)
这样应该可以让你的代码运行起来。
英文:
Couple of things are wrong with your code.
First, you can't access struct members directly off the channel. That is, this line is wrong:
a, b := <-jobs.id, <-jobs.waitime
jobs
is a channel. It does not have any members called id
or waittime
. These are the members of the struct Vertex
it's supposed to transfer. Change this line to:
job := <-jobs
a, b := job.id, job.waitime
But now, your code declares b
but does not use it. To fix, uncomment the call to time.Sleep
:
time.Sleep(time.Sleep(time.Duration(b))) !INCORRECT CALL
But this call is completely wrong. time.Sleep
expects an argument of type time.Duration
and returns nothing. To fix, make the following changes:
time.Sleep(time.Duration(b) * time.Millisecond)
This should get your code running.
答案2
得分: 1
将代码中的部分进行翻译如下:
将:
a, b := <-jobs.id, <-jobs.waitime
改为:
job := <-jobs
a, b := job.id, job.waitime
jobs
是一个通道而不是一个顶点。
英文:
Change:
a, b := <-jobs.id, <-jobs.waitime
to:
job := <-jobs
a, b := job.id, job.waitime
jobs
is a channel not a Vertex.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论