interface对象有两个指针,这两个指针有如下定义:
runtime.h
struct Iface
{
Itab* tab; //对象接口表指针,指向接口类型、动态类型、以及实现接口的方法表;
void* data; //数据指针,是目标对象的只读复制品,要么是完整对象的复制品,要么是一个指针的复制品
};
struct Itab
{
InterfaceType* inter;
Type* type;
void (*func[]) (void);
};
//以下是实例
type Binary uint64 //类型的方法需要和类型本身定义在同一个文件中,所以设置一个别名
func (i Binary) String() string { //为Binary实现了String()接口
return strconv.FormatUint(uint64(i), 10)
}
type Stringer interface { //Binary实现了Stringer的所有(1个)接口
String() string
}
func test(s Stringer) {
s.String()
}
func main() {
b := Binary(0x123)
test(b)
}
在上面的代码中,golang 的参数传递过程是:
分配一块内存 p, 并且将对象 b 的内容拷贝到 p 中; 创建 iface 对象 i,将 i.tab 赋值为 itab<Stringer, Binary>。将 i.data 赋值为 p; 使用 i 作为参数调用 test 函数。 当 test 函数执行 s.String 时,实际上就是在 s.tab 的 fun 中索引(索引由编译器在编译时生成)到 String 函数,并且调用它。
@end
```
最后附上GitHub:https://github.com/gonearewe