GO阅读最后一行

时间:2018-06-03 01:32:23

标签: string go slice

我有一个控制台输入

b a 
c b 
c a 
c c 
c F

我正在阅读如下:

wtf:=make([]string,5)
reader := bufio.NewReader(os.Stdin)
for i:=0;i<5;i++{
        line, _ := reader.ReadString('\n')
        wtf[i]=line
    }

但是,我不是在读最后一行,因为它没有&#39; \ n&#39; 所以我添加了以下代码

var kek string
kek=""
for i:=0;i<2;i++{
    line, _:=reader.ReadString(' ')
    kek+=line
    }

现在wtf存储前4行,kek中存储最后一行。 现在我希望kek成为wtf的第4个元素。据我所知,wtf是一个切片,所以这样做应该没有问题:

wtf[5-1]=kek

但是没有用,我得到的是wtf的输出:

[
b a
c b
c a
c F
]

如果我检查wtf&len;它仍然是5!

P.S。给出了读取的行数和符号总数,因此可以替换n和m的数字5和2。

2 个答案:

答案 0 :(得分:1)

该行:

 kek=""

该行是不必要的,kek已经是一个空字符串,因为空字符串是字符串的nil值。

由于您没有在第一个区块中显示第二个代码块的位置,我无法评论您的错误结果。

无论如何,无论是否有换行符,ReadString都会在最后一行读取。这将有效:

wtf := make([]string)
reader := bufio.NewReader(os.Stdin)
for {
    line, err := reader.ReadString('\n')
    wtf = append(wtf, line)
    if err != nil {
        break;
    }
}

答案 1 :(得分:1)

使用bufio.Scanner代替bufio.Reader。 bufio.Scanner类型为added in Go 1.1,以简化与bufio.Reader不必要的复杂任务。

var wtf []string
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
    wtf = append(wtf, s.Text())
}
if err := s.Err(); err != nil {
    // handle error
}

问题中的wtf元素包含每行末尾的\n。这个答案中的代码没有。