新人不太明白这个接口的调用。有几个问题
```
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’,为什么就不会通过?
查了很多资料都没有详解这个函数调用接口方法的过程。请教大佬们能详解一下整个过程吗。感激不尽
5楼 <a href="/user/yang147896523" title="@yang147896523">@yang147896523</a>
![image.png](https://static.studygolang.com/190510/46495b0ef76695511aecd95d0c6b1746.png)
很明显 validate 分配了b,在调用 Read 之前。
#6