1.面向对象的特性:
封装继承多态是面向对象的三大特性.
2.Go语言实现封装:
go语言中最贴近对象和类概念的无疑结构体,结构体中包含多个字段.某个函数还可以通过将结构体指定为结构体来实现绑定.
2.1demo:
go
package main
import "fmt"
func main() {
worker := Worker{
Name: "itBo",
Age: 18,
hobby: "学习go语言",
}
worker.do()
}
type Worker struct {
Name string
Age int
hobby string
}
func (worker Worker) do() {
fmt.Println(worker.Name, "正在努力的学习")
}
2.2执行结果:

3.值类型绑定方法:
go
package main
import "fmt"
func main() {
worker := Worker{
Name: "itBo",
Age: 18,
hobby: "学习go语言",
}
worker.do()
fmt.Println("当前学习的人", worker.Name)
}
type Worker struct {
Name string
Age int
hobby string
}
func (worker Worker) do() {
fmt.Println(worker.Name, "正在努力的学习")
worker.Name = "itBoBo"
}
3.1执行结果:

从输出内容看出,name字段并未改变.
4.方法绑定指针上:
go
package main
import "fmt"
func main() {
worker := &Worker{
Name: "itBo",
Age: 18,
hobby: "学习go语言",
}
worker.do()
fmt.Println("当前学习的人", worker.Name)
}
type Worker struct {
Name string
Age int
hobby string
}
func (worker *Worker) do() {
fmt.Println(worker.Name, "正在努力的学习")
worker.Name = "itBoBo"
}
4.1执行结果:

从输出结果可以看出,成功修改了name字段.
5.Go语言继承:
5.1组合实现继承:
go
package main
import "fmt"
func main() {
people := People{
name: "itbo",
}
stu := Student{
people: people,
}
stu.people.speak()
}
type People struct {
name string
}
func (people *People) speak() {
fmt.Println("我的名字是:", people.name)
}
type Student struct {
people People
}
5.2执行结果:

5.3字段匿名优化:
go
package main
import "fmt"
func main() {
people := People{
name: "itbo",
}
stu := Student{
people,
}
stu.speak()
fmt.Printf("%+v", stu)
}
func (people *People) speak() {
fmt.Println("我的名字是:", people.name)
}
type Student struct {
People
}
5.4执行结果:

5.5多继承:
go
package main
import "fmt"
func main() {
people := People{
name: "itbo",
}
score := Candidate{
score: 95,
}
stu := Student{
people,
score,
}
//调用people的speak方法.
stu.speak()
//调用Candidate的score方法.
stu.scoreTotal()
fmt.Printf("%+v", stu)
}
type People struct {
name string
}
func (people *People) speak() {
fmt.Println("我的名字是:", people.name)
}
type Student struct {
People
Candidate
}
type Candidate struct {
score int
}
func (Candidate Candidate) scoreTotal() {
fmt.Println("我的总分是", Candidate.score)
}
5.6执行结果:

6.Go语言多态:
从前面的例子可以看出Go语言的继承是一种伪继承.可以通过接口来实现多态.
6.1方法重写无法实现多态.
go
type defaultPlayer struct {
name string
}
func (defaultPlayer *defaultPlayer) train() {
fmt.Println("开始训练")
}
func (defaultPlayer *defaultPlayer) run() {
fmt.Println("开始跑步热身")
}
package main
import "fmt"
func main() {
itboFoot := footBallPlayer{
defaultPlayer{
name: "itbo",
},
}
itboFoot.train()
itboBasket := basketBallPlayer{
defaultPlayer{
name: "itbo",
},
}
itboBasket.train()
}
type footBallPlayer struct {
defaultPlayer
}
func (footBallPlayer *footBallPlayer) train() {
fmt.Println("足球运动员开始训练了")
}
type basketBallPlayer struct {
defaultPlayer
}
func (basketBallPlayer *basketBallPlayer) train() {
fmt.Println("篮球运动员开始训练了")
}
type defaultPlayer struct {
name string
}
func (defaultPlayer *defaultPlayer) train() {
fmt.Println("开始训练")
}
func (defaultPlayer *defaultPlayer) run() {
fmt.Println("开始跑步热身")
}
6.2执行结果:

从结果中可以看粗并没有调用重写的方法.因为组合底层调用的不是一个对象,所以这样行不通.
7.Go语言接口:
scss
type interfaceOne interface {
method1()
method2()
}
接口的定义也是使用type关键字,代表接口也是自定义类型.只是其中声明了若干方法,这些方法不需要方法体.当结构体或者数据类型实现了某个接口的所有方法,就可以说这个结构体或者数据类型实现了这个接口.如果某个接口没有方法声明,也可以称作空接口.
7.1接口实现多态:
go
package main
import "fmt"
func main() {
footPlayer := &footBallPlayer{defaultPlayer{"itbo"}}
baskePlayer := &basketBallPlayer{defaultPlayer{"itbo"}}
footPlayer.sign(footPlayer)
baskePlayer.sign(baskePlayer)
}
type Player interface {
train()
}
func (defaultPlayer *defaultPlayer) sign(player Player) {
fmt.Println(defaultPlayer.name, "签到")
player.train()
}
type footBallPlayer struct {
defaultPlayer
}
func (footBallPlayer *footBallPlayer) train() {
fmt.Println("足球运动员开始训练了")
}
type basketBallPlayer struct {
defaultPlayer
}
func (basketBallPlayer *basketBallPlayer) train() {
fmt.Println("篮球运动员开始训练了")
}
type defaultPlayer struct {
name string
}
func (defaultPlayer *defaultPlayer) train() {
fmt.Println("开始训练")
}
func (defaultPlayer *defaultPlayer) run() {
fmt.Println("开始跑步热身")
defaultPlayer.train()
}
7.2执行结果:

从demo可以看出,实现接口并不需要特殊的关键字.
8.接口嵌套:
go
type Tran interface {
Tran()
}
type Application interface {
render()
Tran
}
8.1接口嵌套运用:
go
type HttpProtocol struct {
}
func (HttpProtocol *HttpProtocol) Tran(){
fmt.Println("tran")
}
func (HttpProtocol *HttpProtocol) render(){
fmt.Println("render")
}
type Tran interface {
Tran()
}
type Application interface {
render()
Tran
}
package main
import "fmt"
func main() {
//定义为接口类型
var protocol Application
protocol = &HttpProtocol{}
protocol.render()
protocol.Tran()
}
8.2执行结果:

语雀地址www.yuque.com/itbosunmian...?
《Go.》 密码:xbkk 欢迎大家访问.提意见.