一个例子短平快的了解 interface 的语法
接口定义
接口实现
接口零值 nil
表达式实现接口的方法,可以赋值给接口变量
实例赋值给接口指针赋值给接口接口赋值给接口
T 型值方法集 (t T)
*T 型值方法集 (t T) 和 (t *T)
判等,可赋值,可判等
类型断言 t = x.(T)
断言是具体类型断言是接口类型断言失败,崩溃断言空接口值,肯定失败,崩溃断言返回二元组,如果成功返回值 和 true断言返回二元组,如果失败返回 nil 和 false, 而不是崩溃
类型分支
例子
package main
import "fmt"
type Reader
interface {
Read() T
}
type Writer
interface {
Write(arg T
)
}
type ReadWrite
interface {
Read() T
Write(arg T
)
}
type T
int64
func (t T
) Read() T
{
return t
}
func (t
*T
) Write(arg T
) {
*t
= arg
}
func main() {
var t T
= 123
var r Reader
var w Writer
var rw ReadWrite
var n ReadWrite
fmt
.Println(t
, r
, w
, rw
, n
)
r
= t
rw
= &t
w
= rw
r
= t
r
= &t
w
= &t
fmt
.Println(t
== r
, &t
== w
, &t
== rw
)
r
= t
t
= r
.(T
)
r
= r
.(Reader
)
r
, ok
:= r
.(Reader
)
fmt
.Println(r
, ok
)
w
, ok
= r
.(Writer
)
fmt
.Println(w
, ok
)
switch rw
:= rw
.(type) {
case nil:
case Writer
:
case Reader
:
case ReadWrite
:
default:
fmt
.Sprintf("%T:%v", rw
, rw
)
}
}
输出
123 <nil> <nil> <nil> <nil>
false true true
123 true
<nil> false
从源码分析接口类型
type iface
struct {
tab
*itab
data unsafe
.Pointer
}
type eface
struct {
_type
*_type
data unsafe
.Pointer
}
type itab
struct {
inter
*interfacetype
_type
*_type
hash
uint32
_ [4]byte
fun
[1]uintptr
}
type _type
struct {
size
uintptr
ptrdata
uintptr
hash
uint32
tflag tflag
align
uint8
fieldalign
uint8
kind
uint8
alg
*typeAlg
gcdata
*byte
str nameOff
ptrToThis typeOff
}
go 类型分类
具体类型 int,string,struct{},…抽象类型 interface
interface接口类型,无数据和方法,定义了一个方法集(一个多个方法声明,包含方法名和签名).不可以实例化,可以定义一个变量.
接口类型
itab
接口类型描述符(静态类型 inter)具体类型描述符(动态类型 _type)方法集(fun) 具体类型值(动态值 data)
空接口类型
具体类型描述符(动态类型 _type)具体类型值(动态值 data)