Go语言入门心法(三): 接口
Go语言入门心法(一)
Go语言入门心法(二): 结构体
Go语言入门心法(三): 接口
一:go语言接口认知
Go语言中接口认知升维:
解决人生问题的自我引导法则: 复盘思维|结构化思维|金字塔思维|体系化思维|系统化思维
面向对象编程(oop)三大特性: 封装,继承,多态
Go语言中,可以认为接口是一种自定义的抽象数据类型,既然是数据类型,那么久可以使用接口声明变量等操作;
它不会暴露出它所代表的内部属性的结构,它只会展示出它自己的方法,因此不能将接口类型实例化;
根据go语言规范,单个函数的接口命名为函数名加上"er"作为后缀;例如:Writer,Reader,Formatter等。
接口命令规范如下:
(1)当个函数名的接口名以"er"作为后缀,接口的实现则去掉“er”字符串
(2)go语言的接口是方法的集合,使用接口是实现模块化的重要方式;接口是用来定义行为类型的,这些被定义的行为不由接口直接实现
(3)与其他语言不同的是,Go语言的接口没有数据字段(接口成员变量),只有定义的抽象的方法,不需要实现方法,不需要方法体
定义接口与订阅结构体类似,定义需要使用type关键字和interface关键字
type InterfaceName interface {
Method()
}
1.1 接口实例一:
package main
// Animal 定义接口
type Animal interface {
Named() string // 接口的方法,返回值类型为string
Speak() string
}
type Cat struct {
}
type Dog struct {
sleepTime string
}
// Named Cat实现接口Animal的Named()抽象方法
func (cat *Cat) Named() string {
return "Cat:named()-cat"
}
// Speak Cat实现接口Animal的Speak()抽象方法
func (cat *Cat) Speak() string {
return "Cat:speak()-cat"
}
// Named Dog实现了Animal接口的Named()抽象方法
func (dog *Dog) Named() string {
return "Dog:named()-dog"
}
// Speak Dog实现了Animal接口的Speak()抽象方法
func (dog *Dog) Speak() string {
return "Dog:speak()-dog"
}
// Sleeper 定义Dog结构体的方法
func (dog *Dog) Sleeper(sleepTime string) {
dog.sleepTime = sleepTime
}
func main() {
println(`
Go语言中接口认知升维:
解决人生问题的自我引导法则: 复盘思维|结构化思维|金字塔思维|体系化思维|系统化思维
面向对象编程(oop)三大特性: 封装,继承,多态
Go语言中,可以认为接口是一种自定义的抽象数据类型,既然是数据类型,那么久可以使用接口声明变量等操作;
它不会暴露出它所代表的内部属性的结构,它只会展示出它自己的方法,因此不能将接口类型实例化;
根据go语言规范,单个函数的接口命名为函数名加上"er"作为后缀;例如:Writer,Reader,Formatter等。
接口命令规范如下:
(1)当个函数名的接口名以"er"作为后缀,接口的实现则去掉“er”字符串
(2)go语言的接口是方法的集合,使用接口是实现模块化的重要方式;接口是用来定义行为类型的,这些被定义的行为不由接口直接实现
(3)与其他语言不同的是,Go语言的接口没有数据字段(接口成员变量),只有定义的抽象的方法,不需要实现方法,不需要方法体
定义接口与订阅结构体类似,定义需要使用type关键字和interface关键字
type InterfaceName interface {
Method()
}
`)
println()
println("=================================定义接口==========================")
// 非指针实例化对象
println("Cat类型就是Animal的一个实例")
var cat = Cat{}
println("Dog类型就是Animal的一个实例")
var dog = Dog{}
println("我的小猫咪: ", cat.Named())
println("我的小猫咪: ", cat.Speak())
println("我的小旺财: ", dog.Named())
println("我的小旺财: ", dog.Speak())
dog.Sleeper("10:50")
println("我的小旺财休息时间: ", dog.sleepTime)
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceAnimalGrammar_go.exe D:\program_file\go_workspace\org.jd.data\interface\OOPToInterfaceAnimalGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceAnimalGrammar_go.exeGo语言中接口认知升维:
解决人生问题的自我引导法则: 复盘思维|结构化思维|金字塔思维|体系化思
维|系统化思维
面向对象编程(oop)三大特性: 封装,继承,多态
Go语言中,可以认为接口是一种自定义的抽象数据类型,既然是数据类型,那么久可
以使用接口声明变量等操作;
它不会暴露出它所代表的内部属性的结构,它只会展示出它自己的方法,因此不能将接口类型实例化;
根据go语言规范,单个函数的接口命名为函数名加上"er"作为后缀;例如:Writer,Reader,Formatter等。
接口命令规范如下:
(1)当个函数名的接口名以"er"作为后缀,接口的实现则去掉“er”字符串
(2)go语言的接口是方法的集合,使用接口是实现模块化的重要方式;接口是用来定义行为类型的,这些被定义的行为不由接口直接实现
(3)与其他语言不同的是,Go语言的接口没有数据字段(接口成员变量),只有定义的抽象的方法,不需要实现方法,不需要方法体
定义接口与订阅结构体类似,定义需要使用type关键字和interface关键字
type InterfaceName interface {
Method()
}
=================================定义接口==========================
Cat类型就是Animal的一个实例
Dog类型就是Animal的一个实例
我的小猫咪: Cat:named()-cat
我的小猫咪: Cat:speak()-cat
我的小旺财: Dog:named()-dog
我的小旺财: Dog:speak()-dog
我的小旺财休息时间: 10:50Process finished with the exit code 0
1.2 接口实例二:
package main
import (
"errors"
"fmt"
)
// IDatabase 定义一个数据库操作的接口
type IDatabase interface {
Connect() error
Disconnect() error
}
// Mysql 实例类型MySQL数据操作
type Mysql struct {
DBName string
isConnect bool
}
// Redis Redis实例类型
type Redis struct {
DBName string
}
// Connect 实现IDatabase接口的Connect方法
func (mysql *Mysql) Connect() error {
fmt.Println("Mysql Connect DB => " + mysql.DBName)
// do Connect
mysql.isConnect = true
if mysql.isConnect {
fmt.Println("Mysql Connect Success !")
return nil
} else {
return errors.New("Connect failure ")
}
}
// Disconnect 实现IDatabase接口的Disconnect方法
func (mysql *Mysql) Disconnect() error {
// do Disconnect
fmt.Println("Mysql Disconnect Success !")
return nil
}
// Connect 实现IDatabase接口的Connect方法
func (redis *Redis) Connect() error {
fmt.Println("Redis Connect DB => " + redis.DBName)
fmt.Println("Redis Connect Success !")
return nil
}
// Disconnect 实现IDatabase接口的Disconnect方法
func (redis *Redis) Disconnect() error {
// do Disconnect
fmt.Println("Redis Disconnect Success !")
return nil
}
func main() {
var mysql = Mysql{DBName: "student"}
println("开始连接")
mysql.Connect()
// do something
fmt.Println("断开连接")
mysql.Disconnect()
var redis = &Redis{DBName: "student"}
println("开始连接")
redis.Connect()
// do something
fmt.Println("断开连接")
redis.Disconnect()
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceIDatabaseGrammar_go.exe D:\program_file\go_workspace\org.jd.data\interface\OOPToInterfaceIDatabaseGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceIDatabaseGrammar_go.exe
开始连接
Mysql Connect DB => student
Mysql Connect Success !
断开连接
Mysql Disconnect Success !
开始连接
Redis Connect DB => student
Redis Connect Success !
断开连接
Redis Disconnect Success !Process finished with the exit code 0
忙着去耍帅,后期补充完整。。。。。