go学习笔记
基础
go 定义变量的几种方式
常量的声明
go基本数据类型
go语言中的流程控制
golang中的数组
切片
golang中的map 详解
golang 函数详解
内置函数 panic/recover
golang time包 以及日志函数
golang中的指针
golang 中的结构体
Golang 结构体 和 json互相转换 序列化 反序列化
Golang 中的 go mod 以及 Golang包 详解
golang 中的接口
golang goroutine channel 实现并发 和 并行
channel
goroutine 互斥锁 读写互斥锁
golang 反射
golang 标准库
io
strconv
工具 + blog
进程 线程 协程
空接口 类型断言
为Go项目编写Makefile
减小 Go 代码编译后的二进制体积
go windows下编译linux可执行文件
本文档使用 MrDoc 发布
-
+
首页
golang 中的接口
## golang 接口的定义 在 golang 中接口(interface) 是一种类型,一种抽象的类型。接口(interface)是一组函数method的集合,golang 中的接口不能包含任何变量。 在golang中接口中的所有方法都没有方法体,接口定义了一个对象的行为规范,只定义规范不实现。接口体现了程序设计的多态和高内聚 低耦合的思想。 golang中的接口也是一种数据类型,不需要显示实现。只需要一个变量含有接口类型中的所有方法,那么这个变量就实现了这个接口。 golang 中每个接口由数个方法组成,接口的定义格式如下: ``` type 接口名 interface { 方法名1(参数列表1) 返回值列表1 方法名2(参数列表2) 返回值列表2 ... } ``` 例子 ``` type Usber interface { //接口 start() stop() } type Phone struct { // phone 结构体 name string } func (p Phone) start() { // phoen 结构体实现 Usber 接口方法 s := p.name fmt.Println(s, "启动") } func (p Phone) stop() { // phoen 结构体实现 Usber 接口方法 fmt.Println(p.name, "停止") } type Computer struct { //computer 结构体 } func (c Computer) connicton(u Usber) { //computer 方法 传入的是 Usber 接口类型的参数 u.start() u.stop() } func main() { var p = Phone{ name: "华为手机", } //实例化 phone var u Usber = p // 让phone 实例 等于 Usber 类型 u.start() u.stop() var computer Computer = Computer{} //实例化一个computer实例 computer.connicton(u) // 执行 computer方法 传入Usber 类型的 phone 实例 } ``` ## 空接口 golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。**空接口表示没有任何约束,因此任何类型变量都可以实现空接口** 空接口在实际项目中用的是非常多的,用空接口可以表示任意数据类型。 ## 类型断言 一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的。这两部分反别称为接口的动态类型和动态值。 如果我们想要判断空接口中值的类型,那么这个时候就可以使用类型断言,其语法格式: ``` x.(T) ``` 其中: * X:表示类型为interface{}的变量 * T: 表示断言x可能是的类型。 该语法返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若 ``` func test(a interface{}) { switch a.(type) { //x.(type) 判断一个变量的类型 这个语句只能用在switch 条件判断中 case int: fmt.Println("int 类型") case string: fmt.Println("string 类型") case float64: fmt.Println("float64 类型") } } func main() { test("hhh") test(12) /* string 类型 int 类型 */ } ``` ## 结构体值接收者和指针接收者实现接口的区别 ## 一个结构体实现多个接口 ``` type annimal1 interface { setName(string) } type annimal2 interface { getName() string } type Dog struct { name string } func (d *Dog) setName(name string) { d.name = name } func (d Dog) getName() string { return d.name } func main() { var d1 = &Dog{} var annimal1 = d1 var annimal2 = d1 annimal1.setName("xiaohe") s := annimal2.getName() fmt.Printf("s: %v\n", s) } ``` ## 接口嵌套 ``` type ainterface interface { setName(string) } type binterface interface { getName() string } type Animal interface { //嵌套 接口a 和 接口b ainterface binterface } type Dog struct { name string } func (d *Dog) setName(name string) { d.name = name } func (d Dog) getName() string { return d.name } func main() { var d1 = &Dog{} var myanimal Animal = d1 myanimal.setName("多接口嵌套") s := myanimal.getName() fmt.Printf("s: %v\n", s) } ```
admin
2022年8月9日 13:08
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码