Golang的学习笔记(13)--Go接口interface
目录
Go的接口
Go的接口定义了一组方法(方法集),但不包含这些方法的具体实现。接口提供了一种方式来说明某类对象具有的行为,它的主要特点如下:
- 接口实际上就是一组方法声明的集合,没有具体实现,没有字段属性
- 某个类型只要实现了某个接口的所有方法,就实现了该接口,不需要显示声明实现了什么接口
- 接口可以嵌入其它的接口
接口的定义和使用
定义接口的形式:
type InterfaceName interface {
Method1(param_list) return_type
Method2(param_list) return_type
}
ShaperArea()PerimeterSquareSquareShaper
//定义接口
type Shaper interface {
Area() float64
Perimeter() float64
}
//定义类型正方形
type Square struct {
side float64
}
//实现接口中的方法Area
func (sq Square) Area() float64 {
return sq.side * sq.side
}
//实现接口中的方法Perimeter
func (sq Square) Perimeter() float64 {
return sq.side * 4
}
func main() {
var sq Shaper
sq = Square{
side: 2,
}
fmt.Println(sq.Area())
}
sq=Square{side:2,}
//定义接口
type Shaper interface {
Area() float64
Perimeter() float64
}
//定义类型正方形
type Square struct {
side float64
}
//实现接口中的方法Area
func (sq *Square) Area() float64 {
return sq.side * sq.side
}
//实现接口中的方法Perimeter
func (sq *Square) Perimeter() float64 {
return sq.side * 4
}
func main() {
var sq Shaper
sq = &Square{
side: 2,
}
}
此外,还需要注意到几点:
- 多个类型可以实现同一个接口
- 实现某个接口的类型除了实现接口要求实现的方法外,还可以有其它的方法
- 一个类型可以实现多个接口
在接口中内嵌接口
在Go接口的声明中同样可以嵌入一个接口,实现该外层接口的类型同样需要实现内嵌接口声明的方法
type Shaper interface {
Area() float64
Perimeter() float64
infoPrint //嵌入接口
}
type infoPrint interface {
PrintInfo()
}
//计算面积
func (sq Square) Area() float64 {
return sq.side * sq.side
}
//计算周长
func (sq Square) Perimeter() float64 {
return sq.side * 4
}
//实现内嵌接口的方法
func (sq Square) PrintInfo() {
fmt.Println("我是一个正方形")
}
func main() {
var sq Shaper
sq = Square{
side: 2,
}
}
接口转换
不同的接口之间可以进行转换,转换的原则是大接口转小接口,即将拥有内嵌子接口的接口转换为内嵌子接口
type Shaper interface {
Area() float64
Perimeter() float64
infoPrint //嵌入接口
}
type infoPrint interface {
PrintInfo()
}
//省略方法实现
func main(){
var sq Shaper
sq = Square{
side: 2,
}
var ip infoPrint
ip = infoPrint(sq) //这里将Shaper转换为inforPrint
ip.PrintInfo()
}
空接口
Object
type Empty interface {}
可以给一个空接口的变量赋值任何类型
类型断言
iTiT
s, ok := i.(T)
iTsiToktrueiTsTokfalse
type Shaper interface {
Area() float64
Perimeter() float64
}
type Square struct {
side float64
}
//计算面积
func (sq Square) Area() float64 {
return sq.side * sq.side
}
//计算周长
func (sq Square) Perimeter() float64 {
return sq.side * 4
}
func main(){
sq := Square{
side: 2,
}
isShape(sq)
}
//判断接口中的数据类型
func isShape(s Shaper) {
if sp, ok := s.(Square); ok {
fmt.Println(sp, "is a shaper")
} else {
fmt.Println("none")
}
}
type-switch
type Shaper interface {
Area() float64
Perimeter() float64
}
type Square struct {
side float64
}
func (sq Square) Area() float64 {
return sq.side * sq.side
}
func (sq Square) Perimeter() float64 {
return sq.side * 4
}
func main(){
sq := Square{
side: 2,
}
whatType(sq)
}
func whatType(s interface{}) {
switch v := s.(type) {
case Square:
fmt.Println(v, "is a square")
case int:
fmt.Println(v, "is a square")
default:
fmt.Println("none")
}
}
whatTypev = s.(type)scasecasedefaulttype-switchfallthrough