繁体   English   中英

转到频道和I / O

[英]Go channels and I/O

第一功能

读F2C

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

写C2F

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

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()
    }
}

这是我收到的错误消息:

prog.go:38: multiple-value r.ReadString() in single-value context
prog.go:65: w.flush undefined (cannot refer to unexported field or method bufio.(*Writer)."".flush)

有多个错误:

1)

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

if (channel2temp < channel1temp)
{

用这个

if channel2temp < channel1temp {

2)

Go中没有while for

for {
...
}

要么

for channel1temp != null || channel2temp != null {
...
}

3)

未声明变量的用法。 通常,通过在首次初始化变量时进行简短的变量声明即可轻松解决。 所以代替:

r = bufio.NewReader(file)

采用

r := bufio.NewReader(file)

4)

尝试分配多值返回到单个变量。 如果一个函数返回两个值,而您只需要一个值,则可以通过将不需要的变量分配给_来丢弃它。 所以代替:

file := os.Open(fn)

采用

file, _ := os.Open(fn)

但最佳做法是捕获该错误:

file, err := os.Open(fn)
if err != nil {
    panic(err)
}

除此之外,还有更多错误,但也许它可以帮助您入门。 我还建议阅读“ 有效的Go”,因为它将解释我刚才提到的许多事情。

编辑:

并且肯定有在线帮助。 它可能是一种新语言,但是在线资料确实有用。 以下是我学习Go时使用的一些技巧:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM