需求是这样的:
我封装了一个函数,遍历csv文件,每次打印一条记录.
我想把它改一下,每次调用这个函数,得到csv中的一条记录(也是遍历).
我是这样写的:
```go
func GetOneline() func() string {
f, err := os.Open("Urls.csv")
if err != nil {
panic( err)
}
read := csv.NewReader(f)
return func() string {
record, err := read.Read()
if err == io.EOF {
return ""
} else if err != nil {
glog.Fatal(err)
}
// fmt.Println(record[0])
return record[0]
}
}
```
因为知道有5条记录,所以这样写可以把五条记录都打印出来:
```go
handler := goSnippet.GetOneline()
for i := 0; i < 5; i++ {
fmt.Println(handler())
}
```
这是结果:
http://www.baidu.com/4128/
http://www.baidu.com/4129/
http://www.baidu.com/4130/
http://www.baidu.com/4131/
http://www.baidu.com/4132/
但是,我假设事先不知道有多少条记录的时候我这样写:
```go
handler = goSnippet.GetOneline()
for {
if str := handler(); len(str) <= 0 {
break
}
fmt.Println(handler())
}
```
然后结果就变成了酱子:
http://www.baidu.com/4129/
http://www.baidu.com/4131/
这是怎么回事??
```go
if str := handler(); len(str) <= 0 {
break
}
fmt.Println(handler())
```
你这里调用了两次 `handler()`。
另外,你这里的代码,打开的文件没有关闭。
#3
更多评论
抱歉。
本站支持的是 markdown 语法格式,你直接写的是 html。预览时,没做转义,post之后,展示时,为了完全,做了转义,所以乱了。
建议您熟悉下 markdown 语法。
#2