关于intGen和printFileContents

来源:7-2 函数式编程例一

万通筋骨创可贴

2020-11-23

在自定义类型里面,讲了扩展Read方法,但是到mian方法运行的时候,又用的printFileContents这个函数,但是intGen和printFileContents是怎么联系一起的,好像没有说明名,我寻思得在前面声明个接口什么的,等到最后也没有,但是居然能运行,求教一下老师,这两个函数是怎么联系在一起的,
还有就是照着视频里的代码去敲,报
cannot use f (type func() int) as type io.Reader in argument to printFileContents: func() int does not implement io.Reader (missing Read method)
下面是我的代码:

package main

import (
   "bufio"
   "fmt"
   "io"
   "strings"
)

func fibonacci() func() int{
   a,b :=0,1
   return func() int{
   	a,b = b,a+b
   	fmt.Println(a)
   	return a
   }
}
type intGen func() int

func (g intGen) Read(p []byte) (n int,err error){
   next:=g()
   if next>10000{
   	return  0,io.EOF
   }
   s:=fmt.Sprintf("%d\n",next)
   return strings.NewReader(s).Read(p)
}

func printFileContents(reader io.Reader){ //这里io.Reader改成 intGen就可以,我的go版本是1.15
   scanner := bufio.NewScanner(reader)
   for scanner.Scan(){
   	fmt.Println(scanner.Text())
   }
}
func main(){
   f:= fibonacci()
   printFileContents(f)
}


写回答

2回答

ccmouse

2020-11-24

同学这样的改法也可以。我在视频里让func fibonacci()返回了intGen,而不是func() int。

这里的关键在于Scanner,它会帮助我们去调用Read函数。Read是一个比较底层的函数,我们一般不会直接调用,而是通过其他库的帮助。

也感谢同学的建议,这一点在视频里的确有所遗漏。

0
1
万通筋骨创可贴
非常感谢!
2020-11-24
共1条回复

ccmouse

2020-11-24

我加了一个锚点,详细的分析了一下。

https://coding.imooc.com/lesson/180.html#mid=10840

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程