关于Go指南Reader的练习

yang147896523 · 2019-05-06 23:56:12 · 1807 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-05-06 23:56:12 的主题,其中的信息可能已经有所发展或是发生改变。

新人不太明白这个接口的调用。有几个问题

type MyReader struct{}

// TODO: 给 MyReader 添加一个 Read([]byte) (int, error) 方法

func (r MyReader) Read(b []byte) (int, error) {
    fmt.Println(len(b))

    b = make([]byte,500,1000)

    fmt.Println(len(b))

    for i := range b {
        b[i] = 'A'
    }
    return len(b), nil
}

func main() {
    reader.Validate(MyReader{})
}

运行结果:

1024
500
got byte 0 at offset 0, want 'A'
  1. 为什么在main里面直接调用MyReader{},然后在Read()方法里面的第一个len(b),显示1024,为什么会自动分配了长度。而且在main里面直接调用MyReader{}里没有加入参数 b []byte设置长度。并且调用了Read()方法的时候,参数b已经被定义了。为什么b会被自动定义了。main调用read的整个流程是什么?

  2. Read()方法中,b已经被定义和被分配长度。当我重新分配空间的时候。这个reader.Validate()函数就会不通过。为什么呢?我看了Validate函数的代码,只是对于b的长度和b里面是否有‘A’进行判断。在这个过程中我的长度对于Validate设置的长度是合法的,并且有‘A’,为什么就不会通过?

查了很多资料都没有详解这个函数调用接口方法的过程。请教大佬们能详解一下整个过程吗。感激不尽


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1807 次点击  
加入收藏 微博
7 回复  |  直到 2019-05-10 13:04:52
sheepbao
sheepbao · #1 · 6年之前

代码发完整先

yang147896523
yang147896523 · #2 · 6年之前
sheepbaosheepbao #1 回复

代码发完整先

这个就是完整代码。除了import 包

sheepbao
sheepbao · #3 · 6年之前

这么说吧,b 是调用Read方法的人分配的,不需要你自己分配,Read本质是把调用者传进入的b进行填充,这里是都填充A。所以b本来就是调用Read之前就分配了的,在这里就是Validate函数里分配的,虽然我也没具体看。如果你自己重新分配了b,那么调用Read的人将读不到任何数据,也就导致reader.Validate失败。main调用read的过程很简单,就是分配一个b,长度1024,然后调用Read(b),检查b是否都是A。

func (MyReader) Read(b []byte) (int,error) {
    for i := range b {
        b[i] = 'A'
    }
    return len(b),nil
}
sheepbao
sheepbao · #4 · 6年之前
yang147896523yang147896523 #2 回复

#1楼 @sheepbao 这个就是完整代码。除了import 包

import 也很重要的,不然我怎么知道reader在哪

yang147896523
yang147896523 · #5 · 6年之前
sheepbaosheepbao #4 回复

#2楼 @yang147896523 import 也很重要的,不然我怎么知道reader在哪

sheepbao
sheepbao · #6 · 6年之前

5楼 @yang147896523

image.png

很明显 validate 分配了b,在调用 Read 之前。

orestonce
orestonce · #7 · 6年之前

形参实参了解一下。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传