gpt4 book ai didi

使用 channel 进行管道

转载 作者:IT王子 更新时间:2023-10-29 01:55:11 26 4
gpt4 key购买 nike

我正在探索 Go 并尝试使用 channel 建立一种管道。我只想在 main() 中读取一些内容并将它们发送到 process() 进行处理,在这种情况下,只需将值打印到屏幕上即可。

不幸的是,在下面的代码中,process() 似乎从来没有从 channel 中读取过,或者至少它没有打印任何东西;我做错了什么?

package main

import ( "fmt" ; "database/sql" ; _ "github.com/lib/pq" ; "time" ; "gopkg.in/redis.v3" )//; "strconv" )

type Record struct {
userId, myDate int
prodUrl string
}


func main(){

//connect to db
db, err := sql.Open(...)
defer db.Close()

//error check here...

//exec query
rows, err := db.Query("select userID,url,date from mytable limit 10")
defer rows.Close()

//error check here...

//create channel to buffer rows read
bufferChan := make(chan *Record,1000)
go process(bufferChan)

//iterate through results and send them to process()
row := new(Record)
for rows.Next(){
err := rows.Scan(&row.userId, &row.prodUrl, &row.myDate)
bufferChan <- row
fmt.Printf("row sent %v",row.userId)
}
}

//prints Record values
func process (buffer chan *Record) {
row := <- buffer
fmt.Printf("row received: %d %v %d ", row.userId,row.prodUrl,row.myDate)
}

最佳答案

func 进程不打印任何内容的原因是 func main 在 for 行循环后退出。Next 完成从而退出程序。你需要做几件事。

  1. 在 for 循环之后添加关闭调用以指示结束添加消息到缓冲 channel 否则会导致死锁。所以打电话关闭(缓冲区陈)
  2. 在您的 func 进程中使用 range 遍历 channel 。
  3. 传递一个额外的 channel 来处理以知道它何时完成main 可以等到进程完成。

例如看下面的代码片段:

package main

import "fmt"

func main() {
bufferChan := make(chan int, 1000)
done := make(chan bool)
go process(bufferChan, done)
for i := 0; i < 100; i++ {
bufferChan <- i
}
close(bufferChan)

select {
case <-done:
fmt.Println("Done")
}

}

func process(c chan int, done chan bool) {
for s := range c {
fmt.Println(s)
}
done <- true

}

关于使用 channel 进行管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com