面向对象
- Golang接口的定义
- 空接口
- 空接口作为函数的参数
- 切片实现空接口
- map的值实现空接口
- 类型断言
- 值接收者和指针接收者
- 接口嵌套
Golang接口的定义
- 接口
interface
是一种抽象的类型。 - 接口定义了一个对象的行为规范,
只定义规范不实现
,由具体的对象来实现规范的细节
。 - 一个对象只要全部实现了接口中的方法,那么就实现了这个接口。
看一个接口示例
package mainimport "fmt"
type Usber interface {start()stop()
}
type Phone struct {Name string
}
func (p Phone) start() {fmt.Println(p.Name, "启动")
}
func (p Phone) stop() {fmt.Println(p.Name, "关机")
}func main() {p := Phone{Name: "小米手机"}var p1 Usber p1 = p p1.start()p1.stop()
}
go中类
- 没有类的概念,也不支持类的继承等面向对象的概念。
- 通过结构体内嵌配合接口比面向对象具有更高的扩展性和灵活性。
空接口
- golang中空接口也可以直接当做类型使用,泛型概念
- 接口可以不定义任何方法,没有定义任何方法的接口就是空接口
- 空接口表示没有约束
- 空接口可以表示任意数据类型
空接口作为函数的参数
package mainimport "fmt"
func show(a interface{}) {fmt.Printf("值:%v 类型:%T\n", a, a)
}func main() {show(20) show("你好") Slice := []int{1, 2, 3, 4}show(Slice)
}
切片实现空接口
package mainimport "fmt"func main() {var Slice = []interface{}{"张三", 20, true, 20.2}fmt.Println(Slice) }
map的值实现空接口
package mainimport "fmt"func main() {var studentInfo = make(map[string]interface{})studentInfo["name"] = "张三"studentInfo["age"] = 10studentInfo["married"] = falsefmt.Println(studentInfo)
}
类型断言
- 一个接口的值是由一个具体类型和具体类型的值两部分组成的。
- 这两部分分别称为接口的动态类型和动态值。
- 如果想要判断空接口中值的类型,那么可以使用类型断言。
- 语法格式:
x.(T)
- x:表示类型为interfact{}的变量
- T:表示断言x可能是的类型
package mainimport "fmt"func main() {var x interface{}x = "hello golang"v, ok := x.(string)if ok {fmt.Println(v)} else {fmt.Println("非字符串类型")}
}
值接收者和指针接收者
值接收者
package mainimport "fmt"type Mover interface {move()
}type Dog struct {
}
func (d Dog) move() {fmt.Println("狗会动")
}func main() {var x Movervar wangcai = Dog{} x = wangcai var fugui = &Dog{} x = fugui x.move()
}
指针接收者
package mainimport "fmt"type Mover interface {move()
}type Dog struct {
}
func (d *Dog) move() {fmt.Println("狗会动")
}func main() {var x Movervar wangcai = Dog{} x = wangcai var fugui = &Dog{} x = fugui x.move()
}
接口嵌套
package mainimport "fmt"type Sayer interface {say()
}type Mover interface {move()
}
type animal interface {SayerMover
}type cat struct {name string
}func (c cat) say() {fmt.Println("喵喵喵")
}func (c cat) move() {fmt.Println("猫动了")
}func main() {var x animalx = cat{name: "大橘"}x.move()x.say()
}