Golang笔记——Interface类型😊
Go语言中的`interface`类型是一种强大的抽象工具,它定义了一组方法签名,但不实现这些方法。任何实现了这些方法的类型都自动满足该接口,这种设计让Go实现了鸭子类型(DuckTyping)的特性。🦆
基本语法
```go
typeSpeakerinterface{
Speak()string
}
typeDogstruct{}
func(dDog)Speak()string{
return"汪汪!"
}
typeCatstruct{}
func(cCat)Speak()string{
return"喵喵~"
}
funcmakeSound(sSpeaker){
fmt.Println(s.Speak())
}
funcmain(){
dog:=Dog{}
cat:=Cat{}
makeSound(dog)//输出:汪汪!
makeSound(cat)//输出:喵喵~
}
```
空接口的特殊性
`interface{}`被称为空接口,它可以保存任何类型的值,类似于Java中的`Object`或TypeScript中的`any`。
```go
funcprintAnything(vinterface{}){
fmt.Printf("值:%v,类型:%T
",v,v)
}
funcmain(){
printAnything(42)//值:42,类型:int
printAnything("hello")//值:hello,类型:string
printAnything(3.14)//值:3.14,类型:float64
}
```
类型断言与类型选择🔍
我们可以使用类型断言来检查接口值的具体类型:
```go
variinterface{}="hello"
s:=i.(string)//类型断言
fmt.Println(s)//hello
s,ok:=i.(string)//安全类型断言
fmt.Println(s,ok)//hellotrue
f,ok:=i.(float64)//安全类型断言
fmt.Println(f,ok)//0false
```
还可以使用`typeswitch`进行类型选择:
```go
funcdoSomething(iinterface{}){
switchv:=i.(type){
caseint:
fmt.Printf("整数:%d
",v)
casestring:
fmt.Printf("字符串:%s
",v)
default:
fmt.Printf("未知类型:%T
",v)
}
}
```
接口的优势✨
1.解耦:接口将定义与实现分离
2.多态:同一接口可以有多种实现
3.可测试性:便于mock和单元测试
4.扩展性:无需修改现有代码即可添加新功能
接口是Go语言中实现抽象和多态的关键工具,合理使用接口可以让代码更加灵活和可维护!🚀
Go语言中的`interface`类型是一种强大的抽象工具,它定义了一组方法签名,但不实现这些方法。任何实现了这些方法的类型都自动满足该接口,这种设计让Go实现了鸭子类型(DuckTyping)的特性。🦆
基本语法
```go
typeSpeakerinterface{
Speak()string
}
typeDogstruct{}
func(dDog)Speak()string{
return"汪汪!"
}
typeCatstruct{}
func(cCat)Speak()string{
return"喵喵~"
}
funcmakeSound(sSpeaker){
fmt.Println(s.Speak())
}
funcmain(){
dog:=Dog{}
cat:=Cat{}
makeSound(dog)//输出:汪汪!
makeSound(cat)//输出:喵喵~
}
```
空接口的特殊性
`interface{}`被称为空接口,它可以保存任何类型的值,类似于Java中的`Object`或TypeScript中的`any`。
```go
funcprintAnything(vinterface{}){
fmt.Printf("值:%v,类型:%T
",v,v)
}
funcmain(){
printAnything(42)//值:42,类型:int
printAnything("hello")//值:hello,类型:string
printAnything(3.14)//值:3.14,类型:float64
}
```
类型断言与类型选择🔍
我们可以使用类型断言来检查接口值的具体类型:
```go
variinterface{}="hello"
s:=i.(string)//类型断言
fmt.Println(s)//hello
s,ok:=i.(string)//安全类型断言
fmt.Println(s,ok)//hellotrue
f,ok:=i.(float64)//安全类型断言
fmt.Println(f,ok)//0false
```
还可以使用`typeswitch`进行类型选择:
```go
funcdoSomething(iinterface{}){
switchv:=i.(type){
caseint:
fmt.Printf("整数:%d
",v)
casestring:
fmt.Printf("字符串:%s
",v)
default:
fmt.Printf("未知类型:%T
",v)
}
}
```
接口的优势✨
1.解耦:接口将定义与实现分离
2.多态:同一接口可以有多种实现
3.可测试性:便于mock和单元测试
4.扩展性:无需修改现有代码即可添加新功能
接口是Go语言中实现抽象和多态的关键工具,合理使用接口可以让代码更加灵活和可维护!🚀
1868

被折叠的 条评论
为什么被折叠?



