热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang接口_golang学习笔记之面向对象、面向接口与面向函数

话接上文隔壁王小猿:golang学习笔记之-Go语言基本语法​zhuanlan.zhihu.com隔壁王小猿:golang学习笔记之--Go语言内建容器
0219a565699d8dec17624d5f007619af.png

话接上文

隔壁王小猿:golang学习笔记之-Go语言基本语法​zhuanlan.zhihu.com
cfd67f4ecace4128e4b34d0127b47e52.png
隔壁王小猿:golang学习笔记之--Go语言内建容器​zhuanlan.zhihu.com
cfd67f4ecace4128e4b34d0127b47e52.png

如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复“Go语言基本语法”即可获得

面向对象

结构体与方法

  • Go语言仅支持封装,不支持多态和继承
  • Go语言没有class,只有struct

结构体的创建

  • 不论地址还是结构本身,一律使用 . 来访问
  • Root:=treeNode{value:3}
  • Root.left=&treeNode{}
  • Root.right=&treeNode{5,nil,nil}
  • Root.right.left=new(treeNode)
  • 示例

var

输出

{

工厂函数-模拟构造函数

  • 返回的局部地址

func

给结构体定义方法

  • 显示定义和命名方法的接收者
  • 使用指针作为方法接收者
    • 只有使用指针才可以改变结构内容
    • nil指针也可以调用方法
  • 示例

type

输出

root

值接收者vs指针接收者

  • 要改变内容必须使用指针接收者
  • 结构过大也考虑使用指针接收者
  • 一致性,如果有指针接收者,最好都是指针接收者
  • 值接收者是go语言特有的
  • 值、指针接收者均可接收值、指针

包&封装

  • Go语言通过名字来区分public和private
  • 名字一般使用CamelCase
  • 首字母大写 public
  • 首字母小写 private

  • 每个目录一个包
  • mian包包含可执行入口
  • main函数所在目录只能有一个main包
  • 为结构定义的方法必须在同一个包内,可以是不同文件

包-扩充系统类型或者别人的类型

  • 定义别名
    • 使用别名myTreeNode封装TreeNode

type

输出

2
0
0
5
3

  • 使用组合
    • 使用int组合实现queue

package

GOPATH环境变量

  • 默认~/go(linux,unix), %USERPROFILE%go(windows)
  • 官方推荐:所有项目和第三方库都放在一个GOPATH下
  • 也可以将每个项目放在不同的GOPATH
  • Go get 命令获取包,也可以用gopm获取
  • GOPATH下目录结构
    • Src
      • Git rep1
      • Git rep2
    • Pkg
      • Git rep1
      • Git rep2
    • Bin
      • 可执行文件

面向接口

duck typing

先问一个比较考三观的问题:图片中的大黄鸭,它是不是一只鸭子呢?

ac67fc263d7b60b411ed0ec4eb84e3e1.png

Duck Typing 的原话是,走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就是一只鸭子。

这个原话是可以灵活理解的,就看我们怎么定义鸭子的行为,我们可以说,能浮在水上游的,黄色的,可爱的就是鸭子,那么,图片中的大黄鸭,它就是一只鸭子!

这就是所谓的 Duck Typing,它只关心事物的外部行为而非内部结构。它并不关心你这只鸭子是长肉的还是充气的。

Python中duck typing

Def

  • 运行时才知道传入的retriever有没有get
  • 需要注释来说明接口

C++中的duck typing

Template

  • 编译时才知道传入的retriever有没有get
  • 需要注释来说明接口

Java中类似代码

<

  • 传入的参数必须实现Retriever接口&#xff0c;编写代码过程中就知道必须包含get方法
  • 不是duck typing

Go语言中的duck typing

  • 同时可以实现多个接口
  • 具有python和c&#43;&#43; 的duck typing的灵活性
  • 又具有Java的类型检查
  • 类似duck typing

接口

  • Go语言接口是由使用者定义的

接口的定义

type

接口的实现

  • 接口的实现是隐式的

type

接口变量里面有什么

  • 接口变量自带指针
  • 接口变量同样采用值传递&#xff0c;几乎不需要使用接口的指针
  • 指针接收者实现只能以指针方式使用&#xff0c;值接收者都可

查看接口变量

  • 表示任何类型&#xff1a;interface{}
  • Type Assertion
  • Type Switch

接口组合

type

面向函数

闭包

a3b0582b7fa7624c0bd5b3dc1c4468c4.png

func

adder函数返回的是一个闭包&#xff0c;不仅仅是一个函数&#xff0c;还包含sum的引用等



推荐阅读
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 在深入探讨进程间通信技术时,本文重点解析了描述符传递的方法。通过详细分析发送和接收描述符的过程,文章首先介绍了发送描述符的具体步骤,并提供了相关函数原型。此外,还讨论了如何高效地在不同进程之间传输文件描述符,以实现资源的共享和同步。这一技术在多进程应用中具有重要意义,能够显著提升系统的性能和可靠性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 蓝桥竞赛中的回形取数问题是一个经典的算法挑战。本文详细解析了该问题的正确实现代码,重点探讨了 `hasNext()` 和 `next()` 方法的区别与应用。尽管两者在功能上类似,都会等待用户输入下一个字符,但它们的返回值类型不同,`hasNext()` 返回一个布尔值,表示是否还有输入,而 `next()` 则直接返回下一个输入的值。通过具体的代码示例和详细的逻辑分析,本文为参赛者提供了宝贵的参考和指导。 ... [详细]
  • 本文详细探讨了在PHP中实现毫秒级时间戳的技术方案,重点讲解了如何处理 `microtime` 函数的返回值以获取高精度时间戳。通过具体的示例代码,展示了该方法的简便性和实用性,适合需要精确时间记录的应用场景。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 清华大学出版社 | 杨丹:基于MATLAB机器视觉的黑色素瘤皮肤癌检测技术及源代码分析(第1689期)
    清华大学出版社 | 杨丹:基于MATLAB机器视觉的黑色素瘤皮肤癌检测技术及源代码分析(第1689期) ... [详细]
  • 深入解析 Java UTC 时间处理技术与应用 ... [详细]
  • 本文详细介绍了在Windows XP系统中安装和配置Unix打印服务的方法,以支持远程行式打印机(LPR)功能。对于同时使用Windows 2000 Server打印服务器和Unix打印服务器的网络环境,该指南提供了实用的步骤和配置建议,确保不同平台之间的兼容性和高效打印。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 深入探讨:Java 8 中 HashMap 链表为何选择红黑树而非 AVL 树
    深入探讨:Java 8 中 HashMap 链表为何选择红黑树而非 AVL 树 ... [详细]
author-avatar
对不起太依赖你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有