1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type Sayer interface {
  8. say()
  9. }
  10. type Mover interface {
  11. move()
  12. }
  13. type Animal interface {
  14. // 接口与接口嵌套创造出新的接口,Animal接口有Sayer和Mover两个接口中的所有方法
  15. Sayer
  16. Mover
  17. }
  18. type Cat struct {}
  19. func (c Cat) say() {
  20. fmt.Println("喵喵喵")
  21. }
  22. func (c Cat) move() {
  23. fmt.Println("猫走路呢")
  24. }
  25. type Dog struct {}
  26. func (d *Dog) say() {
  27. fmt.Println("汪汪汪")
  28. }
  29.  
  30. func main() {
  31. // 1. 实现接口的条件?
  32. // 一个对象只要实现了接口中的所有方法,就实现了该接口
  33.  
  34. // 2. 接口命名规范:接口名称建议以er结尾
  35.  
  36. // 3. 实现了该接口有什么作用?
  37. // 接口类型变量可以存储所有实现了该接口的实例
  38. var s Sayer
  39. s = Cat{} // s接口类型变量存储Cat{}实例
  40. s.say()
  41. s = &Dog{} // s接口类型变量存储Dog{}实例
  42. s.say()
  43.  
  44. // 4. 值接受者和指针接受者实现接口的区别?
  45. // 4.1 值接受者
  46. c := Cat{}
  47. s = c
  48. s.say()
  49. s = &c
  50. s.say()
  51. // 结论:使用值接受者实现该接口后,不论是Cat{}结构体还&Cat{}结构体指针变量都可以赋值给该接口变量
  52. // 因为Go语言中有对指针类型变量求值的语法糖,dog指针fugui内部会自动求值*fugui
  53.  
  54. // 4.2 指针接受者实现该接口
  55. //s = Dog{} 报错
  56. s = &Dog{}
  57. s.say()
  58. // 结论:s接口变量只能接收&Dog{}结构体指针类型,不能接收Dog{}结构体类型
  59.  
  60. // 5. 一个类型可以实现多个接口,而接口间彼此独立,不知道对方的实现
  61. var m Mover
  62. m = Cat{}
  63. s = Cat{}
  64. s.say()
  65. m.move()
  66.  
  67. // 6. 接口嵌套:接口与接口间可以通过嵌套创造出新的接口
  68. var a Animal
  69. a = Cat{}
  70. fmt.Println("====6===")
  71. a.say()
  72. a.move()
  73.  
  74. // 7. 空接口: 指没有定义任何方法的接口,因此任何类型都实现了空接口,空接口类型的变量可以存储任意类型的变量
  75. // 8. 空接口的应用
  76. // 8.1 空接口作为函数的参数,可以接收任意类型的数据
  77. // 8.2 使用空接口可以实现保存任意值的字典
  78. // 8.3 类型断言:空接口可以存储任意类型的值,那我们如何获取存储的具体数据呢
  79. // 一个接口的值(简称接口值)是由一个具体类型和一个具体类型的值两部分组成,
  80. // 这两部分分别称为接口的动态类型和动态值
  81. // 8.4 类型断言语法:i.(T)
  82. // 该语法返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若为true则表示断言成功,为false则表示断言失败。
  83.  
  84. var i interface{}
  85. i = true
  86. // 单个类型断言
  87. if v, ok := i.(int); ok {
  88. fmt.Println(v)
  89. } else {
  90. fmt.Println("i不是int类型")
  91. }
  92.  
  93. // 多个类型断言
  94. switch v := i.(type) {
  95. case string:
  96. fmt.Println(v, "字符串类型")
  97. case int:
  98. fmt.Println(v, "int类型")
  99. default:
  100. fmt.Println("未知类型")
  101. }
  102.  
  103. /*
  104. 因为空接口可以存储任意类型值的特点,所以空接口在Go语言中的使用十分广泛。
  105. 关于接口需要注意的是,只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要定义接口。
  106. 不要为了接口而写接口,那样只会增加不必要的抽象,导致不必要的运行时损耗。
  107. */
  108.  
  109. }

  

参考链接:https://www.topgoer.com/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/%E6%8E%A5%E5%8F%A3.html

golang中接口详解的更多相关文章

  1. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  2. “全栈2019”Java第八十四章:接口中嵌套接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. JDBC常用接口详解

    JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...

  4. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  5. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  6. java中HashMap详解(转)

    java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活       HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...

  7. java集合(2)- java中HashMap详解

    java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...

  8. socket接口详解

    1. socket概述 socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切 ...

  9. “全栈2019”Java第八十三章:内部类与接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. react组件配置样式hover效果的实现

    需求 react 自定义一个组件,组件内部样式可以灵活配置 问题 一般样式都可以通过属性传入,比如:颜色,字号等,但是对于一些有hover效果的地方,属性传入后,按照平时css的使用方式不太容易实现 ...

  2. JAVA里List集合中的对象根据对象的某个属性值降序或者升序排序

    需要使用JDK1.8及以上 package com.stream; import java.util.Comparator; import java.util.List; public class T ...

  3. visual studio c++项目文件分类混乱整理

    演示环境: win10 + vs2015 (下面简称VS)+ visual assist (下面简称VA) 1.混乱 装了VA的VS,有个快捷键,可快速切换 .h 文件和 .cpp(.cc, .cxx ...

  4. 【LeetCode】1466. 重新规划路线 Reorder Routes to Make All Paths Lead to the City Zero (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://lee ...

  5. 【LeetCode】475. Heaters 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcod ...

  6. 【LeetCode】605. Can Place Flowers 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 贪婪算法 日期 题目地址:https://leetcode.c ...

  7. 【LeetCode】334. Increasing Triplet Subsequence 解题报告(Python)

    [LeetCode]334. Increasing Triplet Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode. ...

  8. 修改gorm支持protobuf

    gorm的功能很强大,支持很多很多特性,打算在项目中用上它. 但gorm不支持protobuf,如果idl用的是protobuf,需要对每个message做一个重新定义一个内部的struct,使得可以 ...

  9. 『学了就忘』vim编辑器基础 — 96、末行模式中的相关命令

    目录 1.在文档中显示行号 2.是否显示文档内容相关颜色 3.是否将查找的字符串高亮显示 4.是否显示右下角的状态栏 5.是否在左下角显示如"--INSERT--"之类的状态栏 6 ...

  10. Codeforces 872B:Maximum of Maximums of Minimums(思维)

    B. Maximum of Maximums of Minimums You are given an array a1, a2, ..., an consisting of n integers, ...