新人不太明白这个接口的调用。有几个问题
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'
为什么在
main
里面直接调用MyReader{}
,然后在Read()
方法里面的第一个len(b)
,显示1024,为什么会自动分配了长度。而且在main
里面直接调用MyReader{}
里没有加入参数 b []byte设置长度。并且调用了Read()
方法的时候,参数b已经被定义了。为什么b会被自动定义了。main调用read的整个流程是什么?在
Read()
方法中,b已经被定义和被分配长度。当我重新分配空间的时候。这个reader.Validate()
函数就会不通过。为什么呢?我看了Validate函数的代码,只是对于b的长度和b里面是否有‘A’进行判断。在这个过程中我的长度对于Validate设置的长度是合法的,并且有‘A’,为什么就不会通过?
查了很多资料都没有详解这个函数调用接口方法的过程。请教大佬们能详解一下整个过程吗。感激不尽
有疑问加站长微信联系(非本文作者)

代码发完整先
这个就是完整代码。除了import 包
这么说吧,b 是调用Read方法的人分配的,不需要你自己分配,Read本质是把调用者传进入的b进行填充,这里是都填充A。所以b本来就是调用Read之前就分配了的,在这里就是Validate函数里分配的,虽然我也没具体看。如果你自己重新分配了b,那么调用Read的人将读不到任何数据,也就导致reader.Validate失败。main调用read的过程很简单,就是分配一个b,长度1024,然后调用Read(b),检查b是否都是A。
import 也很重要的,不然我怎么知道reader在哪
https://github.com/golang/tour/blob/master/reader/validate.go 这个是validate的源码
5楼 @yang147896523
很明显 validate 分配了b,在调用 Read 之前。
形参实参了解一下。