golang中接口详解
package main import (
"fmt"
) type Sayer interface {
say()
}
type Mover interface {
move()
}
type Animal interface {
// 接口与接口嵌套创造出新的接口,Animal接口有Sayer和Mover两个接口中的所有方法
Sayer
Mover
}
type Cat struct {}
func (c Cat) say() {
fmt.Println("喵喵喵")
}
func (c Cat) move() {
fmt.Println("猫走路呢")
}
type Dog struct {}
func (d *Dog) say() {
fmt.Println("汪汪汪")
} func main() {
// 1. 实现接口的条件?
// 一个对象只要实现了接口中的所有方法,就实现了该接口 // 2. 接口命名规范:接口名称建议以er结尾 // 3. 实现了该接口有什么作用?
// 接口类型变量可以存储所有实现了该接口的实例
var s Sayer
s = Cat{} // s接口类型变量存储Cat{}实例
s.say()
s = &Dog{} // s接口类型变量存储Dog{}实例
s.say() // 4. 值接受者和指针接受者实现接口的区别?
// 4.1 值接受者
c := Cat{}
s = c
s.say()
s = &c
s.say()
// 结论:使用值接受者实现该接口后,不论是Cat{}结构体还&Cat{}结构体指针变量都可以赋值给该接口变量
// 因为Go语言中有对指针类型变量求值的语法糖,dog指针fugui内部会自动求值*fugui // 4.2 指针接受者实现该接口
//s = Dog{} 报错
s = &Dog{}
s.say()
// 结论:s接口变量只能接收&Dog{}结构体指针类型,不能接收Dog{}结构体类型 // 5. 一个类型可以实现多个接口,而接口间彼此独立,不知道对方的实现
var m Mover
m = Cat{}
s = Cat{}
s.say()
m.move() // 6. 接口嵌套:接口与接口间可以通过嵌套创造出新的接口
var a Animal
a = Cat{}
fmt.Println("====6===")
a.say()
a.move() // 7. 空接口: 指没有定义任何方法的接口,因此任何类型都实现了空接口,空接口类型的变量可以存储任意类型的变量
// 8. 空接口的应用
// 8.1 空接口作为函数的参数,可以接收任意类型的数据
// 8.2 使用空接口可以实现保存任意值的字典
// 8.3 类型断言:空接口可以存储任意类型的值,那我们如何获取存储的具体数据呢
// 一个接口的值(简称接口值)是由一个具体类型和一个具体类型的值两部分组成,
// 这两部分分别称为接口的动态类型和动态值
// 8.4 类型断言语法:i.(T)
// 该语法返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若为true则表示断言成功,为false则表示断言失败。 var i interface{}
i = true
// 单个类型断言
if v, ok := i.(int); ok {
fmt.Println(v)
} else {
fmt.Println("i不是int类型")
} // 多个类型断言
switch v := i.(type) {
case string:
fmt.Println(v, "字符串类型")
case int:
fmt.Println(v, "int类型")
default:
fmt.Println("未知类型")
} /*
因为空接口可以存储任意类型值的特点,所以空接口在Go语言中的使用十分广泛。
关于接口需要注意的是,只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要定义接口。
不要为了接口而写接口,那样只会增加不必要的抽象,导致不必要的运行时损耗。
*/ }
参考链接:https://www.topgoer.com/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/%E6%8E%A5%E5%8F%A3.html
golang中接口详解的更多相关文章
- Java6.0中Comparable接口与Comparator接口详解
Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...
- “全栈2019”Java第八十四章:接口中嵌套接口详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- JDBC常用接口详解
JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...
- Android中Context详解 ---- 你所不知道的Context
转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好, ...
- 【转】 java中HashMap详解
原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...
- java中HashMap详解(转)
java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...
- java集合(2)- java中HashMap详解
java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...
- socket接口详解
1. socket概述 socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切 ...
- “全栈2019”Java第八十三章:内部类与接口详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- AcWing429. 奖学金
题目: 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金. 期末,每个学生都有3门课的成绩:语文.数学.英语. 先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从 ...
- JAVA实现查询栏目、类别(菜单)返回树结构(递归)
其中Channel.java是栏目结构,ChannelDto是我自己封装的返回给前端的数据,可以根据自己的来 这个的逻辑就是双重循环遍历每个类别,然后判断如果当前类别是其他类别的父级,那么就把其他类别 ...
- 【LeetCode】694. Number of Distinct Islands 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...
- 【LeetCode】349. Intersection of Two Arrays 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:Java解法,HashSet 方法二:Pyt ...
- 【LeetCode】476. 数字的补数 Number Complement
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,476, 补数,二进制,Pyth ...
- 【剑指Offer】数组中出现次数超过一半的数字 解题报告(Python)
[剑指Offer]数组中出现次数超过一半的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-inter ...
- A. Lorenzo Von Matterhorn
A. Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes input sta ...
- [炼丹术]UNet图像分割模型相关总结
UNet图像分割模型相关总结 1.制作图像分割数据集 1.1使用labelme进行标注 (注:labelme与labelImg类似,都属于对图像数据集进行标注的软件.但不同的是,labelme更关心对 ...
- MySQL高级查询与编程笔记 • 【第3章 子查询】
全部章节 >>>> 本章目录 3.1 子查询定义和单行子查询 3.1.1 子查询定义 3.1.2 单行子查询应用 3.1.4 实践练习 3.2 多行子查询应用 3.2.1 ...
- mongdb集群
一.mongodb的集群 mongodb有两种架构: 第一种架构:和mysql的结构类似,也有主从结构,但是他不能实现故障自动切换 于是有了第二种架构.官方不推荐使用这种架构. 第二种:mongodb ...