新人不太明白这个接口的调用。有几个问题
```
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’,为什么就不会通过?
查了很多资料都没有详解这个函数调用接口方法的过程。请教大佬们能详解一下整个过程吗。感激不尽
更多评论
这么说吧,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
}
```
#3