Go 要使用通道从os.Stdin写入os.Stdout吗

Go 要使用通道从os.Stdin写入os.Stdout吗,go,channel,Go,Channel,希望实现上述O/p 我们从一个通道写入,该通道从用户读取所有stdin,然后写入stdout。频道读取正在goroutine中进行。虚拟通道是sig形成的,因此我们现在可以无限期地运行它。问题是在第二个select案例中有两个通道操作。仅选择可防止外部操作阻塞。因此,我猜这是家庭作业?您不能从文档中共享bufio.Scanner使用的切片:底层数组可能指向数据,这些数据将被后续的Scanner调用覆盖请使用gofmt。我知道go因为过于固执己见的WRT编码风格而受到了不少批评,但您的代码外观让已

希望实现上述O/p


我们从一个通道写入,该通道从用户读取所有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
    }
}