Go 标准库学习:errors
原生 error 在 Go 的错误处理中,下面的代码占绝大多数: if err != nil { //.... return err } 在满足业务需求的情况下,这种错误处理其实是最推荐的方式,这种直接透传的方式让代码之间的耦合度更低。在很多情况下,如果不关心错误中的具体信息,使用这种方式就可以了。 提前定义好 error 原生的 error 在有些情况下使用起来就不是很...
原生 error 在 Go 的错误处理中,下面的代码占绝大多数: if err != nil { //.... return err } 在满足业务需求的情况下,这种错误处理其实是最推荐的方式,这种直接透传的方式让代码之间的耦合度更低。在很多情况下,如果不关心错误中的具体信息,使用这种方式就可以了。 提前定义好 error 原生的 error 在有些情况下使用起来就不是很...
本篇文章主要想讨论一下,Kubernetes 的 kubectl 命令中的使用到到的一个编程模式 – Visitor(注:其实,kubectl 主要使用到了两个一个是Builder,另一个是Visitor)。本来,Visitor 是面向对象设计模英中一个很重要的设计模款(参看Wikipedia Visitor Pattern词条),这个模式是一种将算法与操作对象的结构分离的一种方法。这种分离...
简单示例 我们先来看一个示例: package main import "fmt" func decorator(f func(s string)) func(s string) { return func(s string) { fmt.Println("Started") f(s) fmt.Println("Done") ...
在本篇文章中,我们学习一下函数式编程的中非常重要的Map、Reduce、Filter的三种操作,这三种操作可以让我们非常方便灵活地进行一些数据处理——我们的程序中大多数情况下都是在到倒腾数据,尤其对于一些需要统计的业务场景,Map/Reduce/Filter是非常通用的玩法。下面先来看几个例子: 基本示例 Map示例 下面的程序代码中,我们写了两个Map函数,这两个函数需要两个参数, ...
反转控制 IoC – Inversion of Control 是一种软件设计的方法,其主要的思想是把控制逻辑与业务逻辑分享,不要在业务逻辑里写控制逻辑,这样会让控制逻辑依赖于业务逻辑,而是反过来,让业务逻辑依赖控制逻辑。在《IoC/DIP其实是一种管理思想》中的那个开关和电灯的示例一样,开关是控制逻辑,电器是业务逻辑,不要在电器中实现开关,而是把开关抽象成一种协议,让电器都依赖之。这样的编...
在本篇文章中,我们来讨论一下 Functional Options这个编程模式。这是一个函数式编程的应用案例,编程技巧也很好,是目前在 Go 语言中最流行的一种编程模式。但是,在我们正式讨论这个模式之前,我们需要先来看看要解决什么样的问题。 配置选项问题 在我们编程中,我们会经常性的需要对一个对象(或是业务实体)进行相关的配置。比如下面这个业务实体(注意,这仅只是一个示例): type ...
错误处理一直以一是编程必需要面对的问题,错误处理如果做的好的话,代码的稳定性会很好。不同的语言有不同的出现处理的方式。Go语言也一样,在本篇文章中,我们来讨论一下Go语言的出错出处,尤其是那令人抓狂的 if err != nil 。 在正式讨论Go代码里满屏的 if err != nil 怎么办这个事之前,我想先说一说编程中的错误处理。这样可以让大家在更高的层面理解编程中的错误处理。 C...
基本概念 音视频采集基本概念 摄像头。用于捕捉(采集)图像和视频。 帧率。现在的摄像头功能已非常强大,一般情况下,一秒钟可以采集 30 张以上的图像,一些好的摄像头甚至可以采集 100 张以上。我们把摄像头一秒钟采集图像的次数称为帧率。帧率越高,视频就越平滑流畅。然而,在直播系统中一般不会设置太高的帧率,因为帧率越高,占的网络带宽就越多。 分辨率。摄像头除了可以设置帧率之外...
在本篇文章中,我会对Go语言编程模式的一些基本技术和要点,这样可以让你更容易掌握Go语言编程。其中,主要包括,数组切片的一些小坑,还有接口编程,以及时间和程序运行性能相关的话题。 Slice 首先,我们先来讨论一下Slice,中文翻译叫“切片”,这个东西在Go语言中不是数组,而是一个结构体,其定义如下: type slice struct { array unsafe.Point...
二叉查找树 type BinaryTree struct { root *Node } type Node struct { item int count int left *Node right *Node } func NewBinaryTree() *BinaryTree { tree := new(BinaryTree) return tree } 插入操作...
1. 插入排序 每次循环迭代都保证一个已排序前缀 时间复杂度 最优:O(n), 最差:O(n^2) 平均:O(n^2) func InsertSort(array []int) []int { for i := 0; i < len(array); i++ { j := i for j > 0 && array[j] < a...
当单体数据库的读写能力成为系统瓶颈时,搭建数据库的主-从模式是一个很好的选择,通过实现读写分离,可以大幅度提升数据库的读写能力。 环境准备 使用docker安装两个mysql容器,分别映射到宿主机的3306、3307端口。 参考如下安装命令: docker run -d --restart=always --name mysql --privileged=true -v /da...
数据库产品有很多种:Redis,MySQL,Oracle,MongoDB,HBase等等。面对众多的存储技术,我们该如何进行技术选型呢? Redis 首先,Redis的使用场景最明确,作为高速缓存或key-value数据库使用,当作为key-value数据库使用时,一般会开启持久化存储,但它的持久化是以快照的形式存在的,所以在重启导致内存数据失效,尝试用本地持久化数据恢复时,可能...
依赖注入是一种消除类之间依赖关系的设计模式,它使客户端不在需要new依赖的对象,而是依靠Ioc容器将客户端的依赖通过构造函数或者属性的方式注入。 使用依赖注入的优点 遵循了控制反转的设计原则,上层不依赖于底层,而是依赖于抽象。减少了项目之间的耦合。 项目灵活性更高,应对业务变更可以快速修改。 减少代码量。 简易代码实现 public static class IocU...
为什么要使用消息队列 系统解耦,减少服务间的依赖。 异步性 流量的削峰填谷,可以让后端服务更加从容的应对流量压力 在使用消息队列的过程中,可能遇到哪些问题 降低了系统的可用性,mq挂掉,可能会导致系统不可用,所以需要搭建集群保证消息队列的高可用。 增加了系统的复杂度,需要考虑消息重复/丢失等问题。 数据一致性问题。如何保证数据的最终一致性。 消息队列中...