热门标签 | 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的引用等



推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
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社区 版权所有