在go语言中,接口就是方法的集合,接口指定了一个类型应该具有的方法,并由该类型决定如何实现这些方法。
接口类型和其他数据类型不同,接口不可以被实例化·
实现方法
type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
…
}
一个不包含任何方法的接口是空接口,我们可以把任何值赋给空接口类型。
var a interface{}
a = "Hello"
a = true
a = 100
接口的值是由一个具体类型
和具体类型的值
两部分组成的。这两部分分别称为接口的动态类型
和动态值
。我们可以通过类型断言来还原实际值
部分参考:Go语言基础之接口 | 李文周的博客 (liwenzhou.com)
var w io.Writer
w = os.Stdout
w = new(bytes.Buffer)
w = nil
第一行声明了一个接口类型的变量w,此时w的类型和值都为nil——接口的零值就是把它的动态类型和值都设置为nil。一个接口值是否为nil取决于它的动态类型,所以现在这是一个nil接口值,可以与nil相比较。
第二行把一个具体类型隐式转换为一个接口类型,这行代码与 w = io.Writer(os.Stdout) 等价。此时,w的动态类型转换为*os.File,而其值则会设置为os.Stdout的副本,即一个指向代表进程的标准输出的os.File类型的指针。执行这行语句后,调用该接口值的方法,会实际调用(*os.File)的方法,如:w.Write等价于(*os.File).Write。第三行语句也同理。
第四行语句会将w的类型和值都设置为nil,把w恢复到它声明时的状态。
接口值可以互相比较,两个接口值的类型和值都是可比较的,且类型和值都相等时才相等。
类型断言格式
a.(T)
a代表接口
T代表a可能是的类型
该表达式返回两个值,一个是a转化为T类型的值,还有一个是代表类型断言是否成功的布尔值
func main() {
var a interface{}
a = "Hello"
v, ok := a.(string)
if ok {
fmt.Println(v)
} else {
fmt.Println("失败")
}
}