1.概念
golang接口是一个动态类型和动态值的集合,定义了对象的行为,不指定实现。只要一个类型定义了接口全部的方法,就可被认为是实现接口
**动态类型:**实现接口的具体数据类型
**动态值:**实现接口的数据的值或者引用
//定义接口
type Speaker interface{
Speak()
}
//实现接口的类型
type Duck struct{}
//实现接口要求的方法
func (Duck)Speack(){
fmt.Println("lalala")
}
func main(){
var s Speaker =Duck{} //接口赋值
s.Speack() //接口方法调用
}
2.接口类型断言与类型判断
类型断言
value := interfaceValue.(T)
//返回两个值:提取的值和一个布尔值 ok,如果断言成功,ok 为 true,否则为 false
value, ok := interfaceValue.(T)
func main() {
var i interface{} = 42
// 类型断言(不安全)不匹配会panic
v := i.(int) // 成功,v 是 int 类型
fmt.Println(v)
// 类型断言(安全)
v2, ok := i.(float64)
if ok {
fmt.Println("Success:", v2)
} else {
fmt.Println("Type assertion failed")
}
}
类型判断
switch v := interfaceValue.(type) {
case T1:
// interfaceValue 的动态类型是 T1
case T2:
// interfaceValue 的动态类型是 T2
default:
// interfaceValue 的动态类型是其他
}
3.接口的nil判断
当接口的type和value都为nil时,接口本身才为nil
接口赋值为nil时,接口类型不为nil,所以接口
参考面试鸭