Go 要使用通道从os.Stdin写入os.Stdout吗
希望实现上述O/pGo 要使用通道从os.Stdin写入os.Stdout吗,go,channel,Go,Channel,希望实现上述O/p 我们从一个通道写入,该通道从用户读取所有stdin,然后写入stdout。频道读取正在goroutine中进行。虚拟通道是sig形成的,因此我们现在可以无限期地运行它。问题是在第二个select案例中有两个通道操作。仅选择可防止外部操作阻塞。因此,我猜这是家庭作业?您不能从文档中共享bufio.Scanner使用的切片:底层数组可能指向数据,这些数据将被后续的Scanner调用覆盖请使用gofmt。我知道go因为过于固执己见的WRT编码风格而受到了不少批评,但您的代码外观让已
我们从一个通道写入,该通道从用户读取所有stdin,然后写入stdout。频道读取正在goroutine中进行。虚拟通道是sig形成的,因此我们现在可以无限期地运行它。问题是在第二个select案例中有两个通道操作。仅选择可防止外部操作阻塞。因此,我猜这是家庭作业?您不能从文档中共享bufio.Scanner使用的切片:底层数组可能指向数据,这些数据将被后续的Scanner调用覆盖请使用gofmt。我知道go因为过于固执己见的WRT编码风格而受到了不少批评,但您的代码外观让已经习惯golang标准格式的ppl更难阅读。像'sig:=make chan bool'这样的语句中的额外空间和select case块的额外缩进级别不应该被忽略there@JimB:我被纠正了,有可能丢失数据,但比赛检测器似乎没有接收到。我从stdin输入1,2,3,…,运行了一个小测试读数,得到了输出1,5,6,8,9。很明显,这是一个竞争条件,但go run-race foo.go没有给出提示…@EliasVanOotegem:仅仅因为输出在逻辑上不正确并不意味着读取和写入同时发生-竞争检测器只能检测何时实际发生了竞争。出于同样的原因,你最初认为没有比赛,这并没有留下一个很大的窗口让它发生。我刚刚在一些100 Mb的归档文件上进行了测试,每个文件只有1到2个数据竞争。谢谢你的回复。我意识到使用select的错误。
/* Want to write from os.Stdin to os.Stdout(fmt.Println() in below code) using channels*/
package main
import (
"fmt"
"io"
"os"
"bufio"
)
type message []byte
/* Function to run the groutine to run for stdin read */
func read (r io.Reader) <-chan message{
lines := make (chan message)
go func() {
defer close(lines)
scan := bufio.NewScanner(r)
for scan.Scan() {
lines <- message(scan.Bytes())
}
}()
return lines
}
func main() {
mes := make (chan message, 1)
sig := make (chan bool)
ch := read (os.Stdin) //Reading from Stdin
for {
select {
case anu := <-mes:
fmt.Println("Message to stdout")
fmt.Println(string(anu)) //Writing to Stdout
case mes <- <-ch:
fmt.Println("Message to channel 2")
continue
}
}
<-sig
/*
The O/P is :
go run writetochan.go
Golang
Message to channel 2
Fun <<< Delayed O/P golang means after putting one more
message only we are getting First message
Message to stdout
Golang
Expected O/P:
go run writetochan.go
Golang
Message to channel 2
Message to stdout
Golang
Fun
Message to channel 2
*/
}
package main
import (
"bufio"
"fmt"
"io"
"os"
)
/* Function to run the groutine to run for stdin read */
func read(r io.Reader) <-chan string {
lines := make(chan string)
go func() {
defer close(lines)
scan := bufio.NewScanner(r)
for scan.Scan() {
lines <- scan.Text()
}
}()
return lines
}
func main() {
mes := read(os.Stdin) //Reading from Stdin
for anu := range mes {
fmt.Println("Message to stdout")
fmt.Println(anu) //Writing to Stdout
}
}
package main
import (
"bufio"
"fmt"
"io"
"os"
)
/* Function to run the groutine to run for stdin read */
func read(r io.Reader) <-chan string {
lines := make(chan string)
go func() {
defer close(lines)
scan := bufio.NewScanner(r)
for scan.Scan() {
s := scan.Text()
lines <- s
}
}()
return lines
}
func main() {
mes := make(chan string, 1)
ch := read(os.Stdin) //Reading from Stdin
go func() {
for m := range ch {
fmt.Println("Message to channel 2")
mes <- m
}
}()
for anu := range mes {
fmt.Println("Message to stdout")
fmt.Println(anu) //Writing to Stdout
}
}