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. MAMP的使用

    MAMP下载并安装 下载地址:https://pan.baidu.com/s/1TgoKBG3F59NGO8lEj9mf4Q 密码:2m3d 安装:按照提示,一直下一步直到完成 MAMP操作

  2. float浮动的详细总结

    float浮动的详细总结 1.定位方案 在css中,有4种常用的方法对元素进行定位和布局: normal flow:标准流.文档流: position:定位(relative.absolute.fix ...

  3. 钉钉提供的内网穿透之HTTP穿透

    此方法无需自行提供服务器和域名 官方地址:https://developers.dingtalk.com/document/resourcedownload/http-intranet-penetra ...

  4. html5调用摄像头截图

    关于html5调用音视频等多媒体硬件的API已经很成熟,不过一直找不到机会把这些硬件转化为实际的应用场景,不过近年来随着iot和AI的浪潮,我觉得软硬结合的时机已经成熟.那我们就提前熟悉下怎么操作这些 ...

  5. 定义Anroid SO崩溃位置

    E:\android-ndk-r13b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin> arm-linux-a ...

  6. 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)

    0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)[本文] 再谈多线程模型之生 ...

  7. 【LeetCode】281. Zigzag Iterator 解题报告 (C++)

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

  8. 【LeetCode】508. Most Frequent Subtree Sum 解题报告(Python & C++)

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

  9. 蓝桥杯练习 Day6 题解

    蓝桥杯练习 Day6 题解 A 题意:给你一个等式ax+by = c,问你x,y是否有整数解. 思路:gcd(a,b) = t,如果方程有解,那么\((a/t)*x + (b/t)*y = c/t\) ...

  10. E. Number With The Given Amount Of Divisors

    E. Number With The Given Amount Of Divisors time limit per test 2 seconds memory limit per test 256 ...