06 2022 档案
摘要:Pod 常见状态 一、Pod 状态(第一阶段) 1)Pending Pod已经被创建,但还没有完成调度,或者说有一个或多个镜像正处于从远程仓库下载的过程。处在这个阶段的 Pod 可能正在写数据到 etcd 中、调度、pull镜像或启动容器。 2)Running 该 Pod 已经绑定到了一个节点上,P
阅读全文
摘要:金丝雀部署 StatefulSet 控制器的资源 一、金丝雀部署 将处于暂存状态的更新操作的 partition 定位于 Pod 资源的最大索引号,即可放出一只金丝雀,由其测试第一轮的更新操作,在确认无误后通过修改 partition 属性的值更新其他的 Pod 对象是一种更为稳妥的更新操作。 St
阅读全文
摘要:StatefulSet资源升级 自 Kubernetes 1.7 版本起,StatefulSet 资源支持自动更新机制,其更新策略由 spec.updateStrategy 字段定义,默认为 RollingUpdate,即滚动更新。 一、滚动更新操作 滚动更新 StatefulSet 控制器的 Po
阅读全文
摘要:StatefulSet资源扩缩容 StatefulSet 资源的扩缩容与 Deployment 资源相似,即通过修改资源的副本数来改动其目标 Pod 资源数量。 对 StatefulSet 资源来说,kubectl scale 和 kubectl path 命令均可实现此功能,也可以使用 kubec
阅读全文
摘要:StatefulSet控制器 应用程序存在 "有状态" 和 "无状态" 两种类别。Kubernetes 系统中,Deployment、ReplicaSet 和 DaemonSet 等常用于管理无状态应用,但实际情况,应用本身是分布式的集群,也有不少有状态的应用,下面我们聊聊 "有状态" 应用的管理。
阅读全文
摘要:Secret资源 Secret 资源的功能类似于 ConfigMap,但它专用于存放敏感数据,例如密码、数字证书、私钥、令牌 和 SSH key 等。 一、Secret概述 Secret 对象存储数据的方式及使用方式类似于 ConfigMap 对象,相同的是,都以键值方式存储数据,在 Pod 资源中
阅读全文
摘要:应用程序配置管理及 ConfigMap 资源 说到配置中心,大家接触过微服务的话,应该不陌生,像国内的分布式配置中心相关开源项目有 Diamond(阿里)、Apollo(携程)、Qconf(奇虎360)和 disconf(百度)等。 作为分布式系统的 Kubernetes 也提供了统一配置管理方案—
阅读全文
摘要:利用环境变量(env.value or env.valueFrom)配置容器应用 在 Kubernetes 中使用此类镜像启动容器时,也可以在 Pod 资源或 Pod 模板资源的定义中,为容器配置段使用 env 参数来定义所使用的环境变量列表。 环境变量配置容器化应用时,需要在容器配置段中嵌套使用
阅读全文
摘要:容器应用配置的配置方式 如何为容器中的应用提供配置信息呢?传统时间中,通常有这么几种途径:启动容器时直接向命令传递参数、将定义好的配置文件编码于(嵌入)镜像文件中、通过环境变量(Environment Variables)传递配置数据,以及基于 Docker 卷传送配置文件等。 一、通过命令行参数进
阅读全文
摘要:downwardAPI存储卷 有时候,应用程序需要基于其所在的环境信息设定运行特性等,这类环境信息包括节点及集群的部分详细属性信息等,例如,Nginx 进程可根据节点的 CPU 核心数量自动设定要启动的 worker 进程数,JVM 虚拟机可根据节点内存资源自动设定其堆内存大小。类似地,托管运行于
阅读全文
摘要:PV 和 PVC 的生命周期 PV 是 Kubernetes 集群的存储资源,而 PVC 则代表着资源需求。创建 PVC 时对 PV 发起的使用申请,即为 "绑定"。PV 和 PVC 是一一对应的关系,可用于响应 PVC 申请的 PV 必须要能够容纳 PVC 的请求条件,它们二者的交互遵循如下声明周
阅读全文
摘要:存储类(StorageClass) 存储类(storage class)是 Kubernetes 资源类型的一种,它是由管理员为管理 PV 之便而按需创建的类别(逻辑组),例如可按存储系统的性能高低分类,或者根据其综合服务质量级别进行分类、依照备份策略分类,甚至直接按管理员自定义的标准进行分类等。
阅读全文
摘要:持久存储卷 通过前面使用持久存储卷(Persistent Volume)的示例可知,Kubernetes 用户必须要清晰了解所用到的网络存储系统的访问细节才能完成存储卷相关的配置任务,例如:NFS存储卷的 server 和 path 字段的配置就依赖于 NFS 服务器地址和共享目录路径。这与 Kub
阅读全文
摘要:GlusterFS存储卷 GlusterFS(Gluster File System)是一个开源的分布式文件系统,是水平扩展存储解决方案 Gluster 的核心,具有强大的横向扩展能力,GlusterFS 通过扩展能够支持数 PB 存储容量和处理数千客户端。 GlusterFS 借助 TCP/IP
阅读全文
摘要:RBD存储卷 Ceph 是一个专注于分布式的、弹性可扩展的、高可靠的、性能优异的存储系统平台,同时支持提供块设备、文件系统和 REST 三种存储接口。它是一个高度可配置的系统,并提供了一个命令行界面用于监视和控制其存储集群。Ceph 还包含鉴证和授权功能,可兼容多种存储网关接口,如 OpenStac
阅读全文
摘要:网络存储卷 Kubernetes 拥有众多类型的用于适配专用存储系统的网络存储卷。这类存储卷包括传统的 NAS 或 SAN 设备(如 NFS、iSCSI、fc)、分布式存储(如 GlusterFS、RBD)、云端存储(如 gcePersistentDisk、azureDisk、cinder 和 aw
阅读全文
摘要:节点存储卷 hostPath hostPath 类型的存储卷是指将工作节点上某文件的目录或文件挂载于 Pod 中的一种存储卷,它可独立于 Pod 资源的生命周期,因而具有持久性。但它是工作节点本地的存储空间,仅适用于特定情况下的存储卷使用需求,例如,将工作节点上的文件系统关联为 Pod 的存储卷,从
阅读全文
摘要:临时存储卷 Kubernetes 支持存储卷类型中,emptyDir 存储卷的生命周期与其所属的 Pod 对象相同,它无法脱离 Pod 对象的声明周期提供数据存储功能,因此 emptyDir 通常仅用数据缓存或临时存储。 不过,基于 emptyDir 构建的 gitRepo 存储卷可以在 Pod 对
阅读全文
摘要:存储卷基本介绍 应用程序在处理请求时,可根据其对当前的处理是否受影响于此前的请求,将应用划分为有状态应用和无状态应用两种。而对于有状态应用,数据持久化是必然之需。 Kubernetes 提供的存储卷(Volume)属于 Pod 资源级别,共享于 Pod 内的所有容器,可用于在容器的文件系统之外存储应
阅读全文
摘要:使用Ingress发布Java服务(以Jenkins为例) 假设有这样一套环境:Kubernetes 集群上的 java-deploy 控制器生成了两个运行于 Pod 资源中的 java 实例,java-svc 是将它们统一暴露于集群中的访问入口。现在需要通过 Ingress 资源将 java-sv
阅读全文
摘要:Ingress 资源 Kubernetes 提供了两种内建的云端负载均衡机制(cloud load balancing)用于发布公共应用,一种是工作于传输层的 Service 资源,它实现的是 "TCP负载均衡器",另一种是 Ingress 资源,它实现的是 "HTTP(S)负载均衡器"。 一、In
阅读全文
摘要:Headless 类型的 Service 资源 Service 对象隐藏了各 Pod 资源,并负责将客户端的请求流量调度到该组 Pod 对象之上。 不过偶尔也存在这样一类需求:客户端需要直接访问 Service 资源后端的所有 Pod 资源,这时就应该向客户端暴露每个 Pod 资源的 IP 地址,而
阅读全文
摘要:服务暴露 Service 的 IP 地址仅在集群内可达,然而,总会有些服务需要暴露到外部网络中接受各类客户端的访问,例如分层架构应用中的前端 Web 应用程序等。此时,就需要在集群的边缘为其添加一层转发机制,以实现将外部请求流量接入到集群的 Service 资源之上,这种操作也称为发布服务到外部网络
阅读全文
摘要:服务发现方式 微服务意味着存在更多的独立服务,但它们并非独立的个体,而是存在着复杂的依赖关系且彼此之间通常需要进行非常频繁地交互和通信的群体。然而,建立通信之前,服务和服务之间该如何获知彼此的地址呢? 在 Kubernetes 系统上,Service 为 Pod 中的服务类应用提供了一个稳定的入口,
阅读全文
摘要:Service资源 一、Service 资源概述 Service 是 Kubernetes 的核心资源类型之一,通常可看作微服务的一种实现。事实上它是一种抽象:通过规则定义出由多个 Pod 对象组合而成的逻辑集合,以及访问这组 Pod 的策略。 Service 关联 Pod 资源的规则要借助于标签选
阅读全文
摘要:CronJob控制器 CronJob 控制器用于管理 Job 控制器资源的运行时间。Job 控制器定义的作业任务在其控制器资源创建之后立即执行,但 CronJob 可以以类似于 Linux 操作系统的周期性任务作业计划(contab)的方式控制其运行的时间点及重复运行的方式,具体如下: 在未来某时间
阅读全文
摘要:Job控制器 与 Deployment 及 DaemonSet 控制器管理的守护进程类的服务应用不同的是,Job 控制器用于调配 Pod 对象运行一次性任务,容器中的进程在正常运行结束后不会对其进行重启,而是将 Pod 对象置于 "Completed"(完成)状态。 若容器中的进程因错误而终止,则需
阅读全文
摘要:DaemonSet 控制器 DaemonSet 是 Pod 控制器的又一种实现,用于在集群中的全部节点上同时运行一份指定的 Pod 资源副本,后续新加入集群的工作节点也会自动创建一个相关的 Pod 对象,当从集群移除节点时,此类 Pod 对象也将被自动回收而无须重建。管理员也可以使用节点选择器及节点
阅读全文
摘要:Deployment控制器 Deployment(简写 deploy)是 Kubernetes 控制器的又一种实现,它构建于 ReplicaSet 控制器之上,可为 Pod 和 ReplicaSet 资源提供声明式更新。 Deployment 控制器资源的主要职责同样是为了保证 Pod 资源的健康运
阅读全文
摘要:ReplicaSet 控制器 Kubernetes 较早期的版本中仅有 ReplicationController 一种类型的 Pod 控制器,后来的版本中陆续引入了更多的控制器实现,这其中就包括用来取代 ReplicationController 的新一代实现 ResplicaSet。 事实上,除
阅读全文
摘要:资源需求及资源限制 一、资源需求 目前来说,资源隔离尚且属于容器级别,CPU 和 内存 资源的配置需要在 Pod 中的容器上进行,每种资源均可由 "requests" 属性定义其请求的确保可用值,即容器运行可能用不到这些额度的资源,但用到时必须要确保有如此多的资源可用,而 "limits" 属性则用
阅读全文
摘要:Pod就绪性探测 Pod 对象启动后,容器应用通常需要一段时间才能完成其初始化过程,例如加载配置或数据,甚至有些程序需要运行某类的预热过程,若在此阶段完成之前即接入客户端的请求,势必会因为等待太久而影响用户体验。因此,应该避免于 Pod 对象启动后立即让其处理客户端请求,而是等待初始化工作完成并转为
阅读全文
摘要:Pod 存活性探测 有不少程序长时间持续运行后逐渐转为不可用状态,并且仅能通过重启恢复,Kubernetes 的容器存活性探测机制可发现诸如此类的问题,并依据探测结果结合重启策略触发后续的行为。 存活性探测是隶属于容器级别的配置,kubelet 可基于它判定何时需要重启一个容器。 1、设置 exec
阅读全文
摘要:Pod对象的声明周期(Pod的相位、创建过程、重要行为、探测、重启策略、终止过程) Pod 对象自从其创建开始至其终止退出的时间范围称为其生命周期。在这段时间中,Pod 会处于多种不同的状态,并执行一些操作;其中,创建主容器(main container)为必须的操作,其他可选的操作还包括进行初始化
阅读全文
摘要:Pod资源使用资源注解(annotation) 一、注解概述 注解(annotation)是 "键值" 类型的数据,不过它不能用于标签及挑选 Kubernetes 对象,仅可用于为资源提供“元数据”信息。另外,注解中的元数据不受字符数量的限制,它可大可小,可以为结构化或非结构化形式,也支持使用在标签
阅读全文
摘要:Pod镜像及其获取策略 各工作节点负责运行 Pod 对象,而 Pod 的核心功能在于运行容器,因此工作节点上必须配置容器运行引擎,如 Docker 等。启动容器时,容器引擎将首先于本地查找指定的镜像文件,不存在的镜像则需要从指定的镜像仓库(Registry)下载到本地,如下图所示: Kubernet
阅读全文
摘要:分布式系统设计中几种容器运行模型 一、Sidecar pattern(边车模型或跨斗模型) 为 Pod 主应用容器提供协同的辅助应用容器,每个应用独立运行,最为典型的代表是将主应用容器中的日志使用 agent 收集至日志服务器中时,可以将 agent 运行为辅助应用容器,即 sidecar。另一个典
阅读全文
摘要:spec和status字段 Kubernetes 用 spec 来描述所期望的对象应该具有的状态,而用 status 字段来记录对象在系统上的当前状态,因此 status 字段仅对活动对象才有意义。 这两个字段都属于嵌套类型的字段。在定义资源配置清单时, spce 是必须定义的字段,用于描述对象的目
阅读全文
摘要:使用部署工具安装 Kubernetes https://kubernetes.io/zh/docs/setup/production-environment/tools/,此页面是 Kubernetes 的官方概述。 使用 kubeadm 引导集群 使用 Kops 安装 Kubernetes 使用
阅读全文
摘要:k8s网络模型基础 云计算的核心是虚拟化技术,网络虚拟化又是其最重要的组成部分,用于在物理网络上虚拟多个相互隔离的虚拟网络,实现网络资源切片,提高网络资源利用率,实现弹性化网络。Kubernetes 作为容器云技术栈中的容器编排组件,必然需要在多租户(名称空间)的基础上实现弹性网络管理,这也是“基础
阅读全文
摘要:k8s集群组件 一个典型的 Kubernetes 集群由多个工作节点(worker node)和一个集群控制平面(control plane,即 Master),以及一个集群状态存储系统(etcd)组成。其中 Master 节点负责整个集群的管理工作,为集群提供管理接口,并监控和编排集群中的各个工作
阅读全文
摘要:HTTP/HTTPS 代理 Docker 守护程序在其启动环境中使用 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY 环境变量来配置 HTTP 或 HTTPS 代理。NO_PROXY 您不能使用该 daemon.json 文件配置这些环境变量。 此示例覆盖默认 docker.se
阅读全文
摘要:检查 Docker 是否正在运行 检查 Docker 是否正在运行的独立于操作系统的方法是使用 docker info 命令询问 Docker。 您还可以使用操作系统实用程序,例如 sudo systemctl is-active docker 或 sudo status docker 或 sudo
阅读全文
摘要:堆栈跟踪 一、强制记录堆栈跟踪 Linux: sudo kill -SIGUSR1 $(pidof dockerd) 视窗服务器: 下载docker-signal。 获取 dockerd 的进程 ID Get-Process dockerd。 运行带有标志的可执行文件--pid=<PID of da
阅读全文
摘要:启用调试 有两种方法可以启用调试。推荐的方法是在 daemon.json 文件中将调试键设置为 true。此方法适用于每个 Docker 平台。 编辑 daemon.json 文件,该文件通常位于/etc/docker/。如果此文件尚不存在,您可能需要创建它。在 macOS 或 Windows 上,
阅读全文
摘要:Docker日志 守护程序日志可以帮助您诊断问题。日志可能保存在几个位置之一,具体取决于操作系统配置和使用的日志记录子系统: 操作系统地点 Linux 使用命令journalctl -xu docker.service(或读取/var/log/syslog或/var/log/messages,取决于
阅读全文
摘要:daemon.json解决和启动脚本之间的冲突 一、daemon.json解决和启动脚本之间的冲突 如果您使用 daemon.json 文件,也手动或使用启动脚本将选项传递给 dockerd 命令,并且这些选项发生冲突,则 Docker 无法启动并出现以下错误: unable to configur
阅读全文
摘要:Docker守护进程目录 Docker 守护进程将所有数据保存在一个目录中。这会跟踪与 Docker 相关的所有内容,包括 containers, images, volumes, service definition 和 secrets。 默认情况下,此目录为: /var/lib/docker 在
阅读全文
摘要:配置Docker守护进程 有两种方式来配置 Docker 守护进程: 使用 JSON 配置文件。这是首选选项,因为它将所有配置保存在一个地方。 开始时使用标志dockerd。 只要您没有在标志和 JSON 文件中指定相同的选项,就可以同时使用这两个选项。如果发生这种情况,Docker 守护程序将不会
阅读全文
摘要:使用多阶段构建 多阶段构建对于努力优化 Dockerfile 并使其易于阅读和维护的任何人都非常有用。 一、在多阶段构建之前 构建 images 最具挑战性的事情之一就是缩小 image 大小。Dockerfile 中的每条指令都会为映像添加一层,您需要记住在继续下一层之前清理您不需要的任何工件。要
阅读全文
摘要:编写 Dockerfile 的最佳实践 本文档涵盖了构建高效映像的推荐最佳实践和方法。 Dockerfile Docker 通过从一个包含构建给定镜像所需的所有命令的文本文件中读取指令来自动构建镜像。Dockerfile 遵循特定格式和指令集,您可以在 Dockerfile 参考 中找到。 一个 D
阅读全文
摘要:Dockerfile 参考 预计阅读时间:87 分钟,此页面是 Docker 官方概述,https://docs.docker.com/engine/reference/builder/ Docker 可以通过读取来自 Dockerfile. Dockerfile 是一个文本文档,其中包含用户可以在
阅读全文
摘要:Docker 本地镜像的漏洞扫描 希望加快您的开发周期?快速检测并了解如何通过运行来修复图像中的 CVE docker scan IMAGE_NAME。查看如何扫描图像了解详细信息。 Docker 本地镜像的漏洞扫描允许开发人员和开发团队查看容器镜像的安全状态,并采取措施修复扫描期间发现的问题,从而
阅读全文
摘要:为Docker指定DNS服务器 如果您的容器需要解析网络内部的主机,那么公共名称服务器就不够用了。你有两个选择: 您可以指定 Docker 使用的 DNS 服务器,或者 dnsmasq 您可以在 NetworkManager 中禁用。如果您这样做,NetworkManager 会将您真正的 DNS
阅读全文
摘要:IP转发问题 如果您使用 219 或更高版本手动配置网络 systemd-network,systemd Docker 容器可能无法访问您的网络。 从 systemd 版本 220 开始,给定网络 ( net.ipv4.conf.<interface>.forwarding) 的转发设置默认为off
阅读全文
摘要:内核兼容性 如果您的内核版本低于 3.10 版或缺少某些模块,则 Docker 无法正常运行。要检查内核兼容性,您可以下载并运行该check-config.sh 脚本。 curl https://raw.githubusercontent.com/docker/docker/master/contr
阅读全文
摘要:在 Docker 守护进程上启用 IPv6 要在 Docker 守护程序上启用 IPv6,请参阅 启用 IPv6 支持。 Before you can use IPv6 in Docker containers or swarm services, you need to enable IPv6 s
阅读全文
摘要:以非 root 用户身份管理 Docker Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归用户所有root,其他用户只能使用sudo。 Docker 守护程序始终以root用户身份运行。 如果您不想在 docker 命令前加上sudo,请创建一个名
阅读全文
摘要:在 CentOS 上安装 Docker Engine https://docs.docker.com/engine/install/centos/,此页面是 Docker 的官网概述。 要在 CentOS 上开始使用 Docker 引擎,请确保满足先决条件,然后安装 Docker。 一、先决条件 1
阅读全文
摘要:Docker网络实现 https://docs.docker.com/network/,此页面是 Docker 的官方概述。 Docker 容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连接到非 Docker 工作负载。Docker 容器和服务甚至不需要知道它们部署在 Docker
阅读全文
摘要:Docker底层技术 一、Docker 底层的核心技术 Docker 是用Go 编程语言编写的,并利用 Linux 内核的几个特性来提供其功能。 Docker 使用一种称为容器 namespaces 的技术来提供隔离的工作空间。当您运行容器时,Docker 会为该容器创建一组 命名空间。 这些命名空
阅读全文
摘要:Docker架构 要理解 Docker 架构,必须知道 Docker 三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统,比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。 容器(
阅读全文
摘要:容器部署发展简史 互联网企业生成环境的应用部署所经历的过程,大致可分为三个阶段: 物理机部署 虚拟机部署 容器化部署 1、传统部署时代: 早期,各个组织机构在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序,则可能会
阅读全文
摘要:反射的类型对象(reflect.Type) 反射 是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可
阅读全文
摘要:示例:工厂模式自动注册——管理多个包的结构体 本例利用包的 init 特性,将 cls1 和 cls2 两个包注册到工厂,使用字符串创建这两个注册好的结构实例。 代码1-1 类工厂(具体文件:../clsfactory/base/factory.go) package base //类接口 type
阅读全文
摘要:导入包(import)——在代码中使用其他的代码 要引用的其他包的标识符,可以使用 import 关键字,导入的包名使用双引号包围,包名是从 GOPATH 开始计算的路径,使用 "/" 进行路径分隔。 1、默认导入的方法 导入有两种基本格式,即单行导入和多行导入,两种导入方法的导入代码效果是一致的。
阅读全文
摘要:导出标识符——让外部访问包的类型和值 在 Go 语言中,如果想在一个包里引用另外一个包里的标识符(如 类型、变量、常量等)时,必须首先将被引用的标识符导出,将要导出的标识符的首字母大写就可以让引用者可以访问这些标识符了。 1、导出包内标识符 标识符首字母为小写,这些标识符可以在包内自由使用,但是包外
阅读全文
摘要:创建包 package——编写自己的代码扩展 包(package)是多个 Go 源码的集合,是一种高级的代码复用方案,Go 语言默认为我们提供了很多包,如 fmt、os、io 包等,开发者可以根据自己的需要创建自己的包。 包要求在同一个目录下的所有文件的第一行添加如下代码,以标记该文件归属的包: p
阅读全文
摘要:工作目录(GOPATH) Go 语言的源码复用建立在包(package)基础之上。Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,必须同样以包的方式进行引用。 Go 语言的包与文件夹一一对应,所有与包相关的操作,必须依赖于工作目录(GOPAT
阅读全文
摘要:示例:实现有限状态机(FSM) 有限状态机(Finite-State Machine,FSM),表示有限个状态及在这些状态间的转移和动作等行为的数学模型。 本例将实现状态接口、状态管理器及一系列的状态和使用状态的逻辑。 1、状态的概念 状态机中的状态与状态间能够自由转换。但是现实当中的状态却不一定能
阅读全文
摘要:类型分支——批量判断空接口中变量的类型 Go 语言的 switch 不仅可以像其他语言一样实现数值、字符串的判断,还有一种特殊的用途——判断一个接口内保存或实现的类型。 1、类型断言的书写格式 switch 实现类型分支时的写法格式如下: switch 接口变量.(type) { case 类型1:
阅读全文
摘要:示例:使用空接口实现可以保存任意值的字典 空接口可以保存任何类型这个特性可以方便地用于容器的设计。 下面例子使用 map 和 interface{} 实现了一个字典。字典在其他语言中的功能和 map 类似,可以将任意类型的值做成键值对保存,然后进行找回,遍历操作。 代码1-1 实现字典(/dict/
阅读全文
摘要:空接口类型(interface{})——能保存所有值的类型 空接口是接口类型的特殊形式,空接口没有任何方法,因此任何类型都无须实现空接口。 从实现的角度看,任何值都满足这个接口的需求。因此空接口类型可以保存任何值,也可以从空接口中取出原值。 提示: 空接口类型类似于 C# 或者 Java 语言中的
阅读全文
摘要:在接口和类型间转换 Go 语言中使用的接口断言(type assertions)将接口转换成另外一个接口,也可以将接口转换为另外的类型。接口的转换在开发中非常常见,使用也非常频繁。 1、类型断言的格式 类型断言的基本格式如下: t := i.(T) i 代表接口变量。 T 代表转换的目标类型。 t
阅读全文
摘要:接口的嵌套组合——将多个接口放在一个接口内 在 Go 语言中,不仅结构体与结构体之间可以嵌套,接口与接口之间也可以通过嵌套创造出新的接口。 接口与接口嵌套组合而成了新接口,只要接口的所有方法被实现,则这个接口中的所有嵌套接口的方法均可以被调用。 1、系统包中的接口嵌套组合 Go 语言中的 io 包中
阅读全文
摘要:示例:使用接口进行数据的排序 排序是常见的算法之一,也是常见的面试题之一,程序员对各种排序算法也是津津乐道。 实际使用中,语言的类库会为我们提供健壮、高性能的排序算法库,开发者在了解排序算法基本原理的基础上,应该避免 “造轮子”,直接使用已有的排序算法库,以缩短开发周期,提高开发效率。 Go 语言中
阅读全文
摘要:示例:便于扩展输出方式的日志系统 日志可以用于查看和分析应用程序的运行状态。日志一般可以支持输出多种形式,如命令行、文件、网络等。 1、日志对外接口 本例中定义一个日志写入器接口(LogWriter),要求写入设备必须遵守这个接口协议才能被日志器(Logger)注册。日志器有一个写入器的注册方法(L
阅读全文