还是一个闭包的问题

zykzhang · · 2067 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

需求是这样的: 我封装了一个函数,遍历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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2067 次点击  
加入收藏 微博
6 回复  |  直到 2015-04-21 07:15:26
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传