Io Go通道和I/O

Io Go通道和I/O,io,go,channel,Io,Go,Channel,第一功能 ReadF2C 获取文件名和通道,读取文件并在通道中输入。 第二功能 WriteC2F 获取2个通道和文件名,获取每个通道的值,并将较低的值保存在输出文件中。我肯定有一些语法错误,但我是新手 package main import ( "fmt" "bufio" "os" "strconv" ) func main() { fmt.Println("Hello World!\n\n") cs1 := make (chan int)

第一功能

ReadF2C

获取文件名和通道,读取文件并在通道中输入。 第二功能

WriteC2F

获取2个通道和文件名,获取每个通道的值,并将较低的值保存在输出文件中。我肯定有一些语法错误,但我是新手

package main

import (
    "fmt"
    "bufio"
    "os"
    "strconv"
)

func main() {
    fmt.Println("Hello World!\n\n")
    cs1 := make (chan int)
    var nameinput string = "input.txt"
    readF2C(nameinput,cs1)
    cs2 := make (chan int)
    cs3 := make (chan int)
    cs2 <- 10
    cs2 <- 16
    cs2 <- 7
    cs2 <- 2
    cs2 <- 5
    cs3 <- 8
    cs3 <- 15
    cs3 <- 14
    cs3 <- 1
    cs3 <- 6
    var nameoutput string = "output.txt"
    writeC2F (nameoutput,cs2,cs3)
}

func readF2C (fn string, ch chan int){
    f,err := os.Open(fn)
    r := bufio.NewReader(f)
    for err != nil { // not end of file 

    fmt.Println(r.ReadString('\n'))
    ch <- r.ReadString('\n')
    }

    if err != nil {
        fmt.Println(r.ReadString('\n'))
            ch <- -1
    }

}
func writeC2F(fn string, // output text file
ch1 chan int, // first input channel
ch2 chan int){
    var j int = 0
    var channel1temp int
    var channel2temp int
        f,_ := os.Create(fn)
        w := bufio.NewWriter(f)
    channel1temp = <-ch1
    channel2temp = <-ch2
    for j := 1; j <= 5; j++ {
     if (channel2temp < channel1temp){

        n4, err := w.WriteString(strconv.Itoa(channel1temp))
        } else{

        n4, err := w.WriteString(strconv.Itoa(channel2temp))
        }
    w.flush()
    }
}

有多个错误:

1)

与C不同,Go强制您在语句后直接使用花括号。因此,对于if情况(func也是如此),不要这样做:

if (channel2temp < channel1temp)
{

3)

非声明变量的使用。通过在第一次初始化变量时进行简短的变量声明,通常很容易修复。因此,不是:

r = bufio.NewReader(file)
file := os.Open(fn)
使用

4)

尝试将多值返回赋值到单个变量中。如果一个函数返回两个值,而您只需要一个值,则可以通过将不需要的变量赋给
\uu
来丢弃该变量。因此,不是:

r = bufio.NewReader(file)
file := os.Open(fn)
使用

但最佳做法是捕捉错误:

file, err := os.Open(fn)
if err != nil {
    panic(err)
}
除此之外还有更多的错误,但也许这会让你开始。 我还建议阅读,因为它可以解释我刚才提到的许多事情

编辑:

file, err := os.Open(fn)
if err != nil {
    panic(err)
}
当然,网上也有帮助。它可能是一种新的语言,但在线材料确实很有用。以下是我在学习围棋时使用的一些方法:

  • :关于如何编写惯用Go代码的好文档
  • :带互动示例的围棋在线教程
  • :Go程序的交互式示例,从Hello World开始
  • :作为规范,其可读性令人惊讶。也许不是一个起点,但非常有用

感谢您的详细回复,语法是一个主要问题,但我更关心的是文件读写以及文件结束条件,为了满足程序的要求,在调试逻辑之前,我对代码进行了编辑,我们应该弄清楚语法。第38行的问题是:由于
r.Readstring()
返回两个值,因此不能直接将值放入通道中。首先读取
s,err:=r.ReadString('\n')
,然后进行错误检查,然后将值(
s
,在我的例子中)放入通道。第65行是一个简单的区分大小写的错误:使用
w.Flush()
而不是
w.Flush()
。一旦真正开始编码,您就必须处理语法错误,所以现在是开始的最佳时机。
file := os.Open(fn)
file, _ := os.Open(fn)
file, err := os.Open(fn)
if err != nil {
    panic(err)
}