package main
import (
"fmt"
)
// 定义一个结构体
type MyReader struct{}
// 实现Reader接口的Read方法
func (mr MyReader) Read(p []byte) (n int, err error) {
// 这里简单示例,将字符串写入p
str := "Hello, World!"
copy(p, str)
return len(str), nil
}
函数签名在接口实现过程中的作用
- 一致性要求:接口
Reader
定义了Read
方法的函数签名Read(p []byte) (n int, err error)
。结构体MyReader
实现该接口时,其Read
方法的函数签名必须与之完全一致。这包括方法名、参数列表和返回值列表。如果函数签名不一致,编译器会报错,表明该结构体没有正确实现接口。
- 行为契约:函数签名实际上是接口与实现者之间的一种契约。接口使用者根据这个签名来调用方法,实现者按照这个签名来提供具体的功能。例如,在
Reader
接口中,使用者期望传入一个[]byte
类型的切片p
,并得到读取的字节数n
以及可能的错误err
。实现者必须按照这个约定来编写Read
方法,以保证接口的正确使用。
- 多态基础:正是因为函数签名的严格匹配,Go语言才能实现基于接口的多态。不同的结构体只要实现了相同接口的相同函数签名的方法,就可以在需要该接口的地方进行互换使用,而调用者不需要关心具体是哪个结构体提供的实现。