package?main
import?(
???"bufio"
???"fmt"
???"io"
???"strings"
)
type?IntFunc?func()?int
func?fibonacci()?IntFunc?{
???a,?b?:=?0,?1
???return?func()?int?{
??????a,?b?=?b,?a+b
??????return?a
???}
}
func?(f?IntFunc)?Read(b?[]byte)?(i?int,?err?error)?{
???next?:=?f()
???if?next?>?10000?{
??????return?0,?io.EOF
???}
???s?:=?fmt.Sprintf("%d\n",?next)
???return?strings.NewReader(s).Read(b)
}
func?printFileContents(reader?io.Reader)?{
???scanner?:=?bufio.NewScanner(reader)
???for?scanner.Scan()?{
??????fmt.Printf("%s?\n",?scanner.Text())
???}
}
func?main()?{
???f?:=?fibonacci()
???printFileContents(f)
}
為什么形參是一個io.Reader??實參是一個函數(shù)??而不報錯
1 回答

pardon110
TA貢獻(xiàn)1038條經(jīng)驗 獲得超227個贊
io.Reader并不是形參,它是一個接口類型,其簽名如下所示
type?Reader?interface?{???? ????Read(p?[]byte)?(n?int,?err?error) }
真正的形參是reader。之所以實參是一個函數(shù)而不出錯,是因為作為方法的接收者,該函數(shù)InFunc類型,隱性實現(xiàn)了接口io.Reader的Read方法,換而言之,該實參函數(shù)類型也是一個io.Reader類型。而其實現(xiàn)接口體現(xiàn)在這句
func?(f?IntFunc)?Read(b?[]byte)?(i?int,?err?error)?{...
- 1 回答
- 0 關(guān)注
- 848 瀏覽
添加回答
舉報
0/150
提交
取消