当前位置: 首页 > news >正文

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.exe

        Go语言中接口认知升维:
            解决人生问题的自我引导法则: 复盘思维|结构化思维|金字塔思维|体系化思
维|系统化思维
        面向对象编程(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:50

Process 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
 

 

 忙着去耍帅,后期补充完整。。。。。

相关文章:

  • 端到端的机器学习项目(Machine Learning 研习之六)
  • 深入了解 JavaScript 中的构造函数和对象创建
  • 最新ai创作系统CHATGPT系统源码+支持GPT4.0+支持ai绘画(Midjourney)
  • 海康威视、大华、宇视rtsp实时读取网络摄像头
  • c++string类的赋值问题
  • Android Handler/Looper视角看UI线程的原理
  • 1.12.C++项目:仿muduo库实现并发服务器之LoopThreadPool模块的设计
  • PCL点云处理之从两片点云中获取具有匹配关系的同名点对 (二百一十八)
  • 【音视频|ALSA】SS528开发板编译Linux内核ALSA驱动、移植alsa-lib、采集与播放usb耳机声音
  • vsc连接wsl安装vsc时遇到权限问题的解决方案
  • 如何使用ChatPPT生成PPT文档
  • SpringCloud-Gateway
  • LENOVO联想笔记本小新 Pro-14 2021AMD处理器ACH版(82MS)原厂Win10系统
  • ElementUI编辑表格单元格与查看模式切换的应用
  • 算法解析:LeetCode——机器人碰撞和最低票价
  • Qt工具开发,该不该跳槽?
  • Pytorch之MobileViT图像分类
  • 使用PyTorch处理多维特征输入的完美指南
  • hive抽取mysql里的表,如果mysql表没有时间字段如何做增量抽取数据
  • Spring Boot中的异步编程:解决的问题与应用场景
  • 国家税务总局泰安市税务局:山东泰山啤酒公司欠税超536万元
  • 青岛双星名人集团管理权之争:公司迁址,管理层更迭
  • 中俄领导人将讨论从俄罗斯经蒙古至中国天然气管道项目?外交部回应
  • “半世纪来对无争议边界最深入袭击”:印巴冲突何以至此又如何收场?
  • “模”范生上海,如何再进阶?
  • 山大齐鲁医院护士论文现“男性确诊子宫肌瘤”,院方称将核实