【面试篇】Go语言常见踩坑(一)

2021-10-28
阅读 2 分钟
2k
For循环在我们日常编码中可能用的很多。在很多业务场景中我们都需要用for循环处理。但golang中的for循环在使用上需要注意一些问题,大家可否遇到。先看下边这一段代码:

【深入理解Go】从0到1实现一个validator

2021-09-27
阅读 6 分钟
2.4k
validator是我们平时业务中用的非常广泛的框架组件,很多web框架、微服务框架都有集成。通常用来做一些请求参数的校验以避免写出重复的检验逻辑。接下来的文章中,我们就去看看如何去实现一个validator。

【深入理解Go】从0到1实现一个filter(middleware)

2021-09-26
阅读 6 分钟
4.4k
filter(也称middleware)是我们平时业务中用的非常广泛的框架组件,很多web框架、微服务框架都有集成。通常在一些请求的前后,我们会把比较通用的逻辑都会放到filter组件来实现。如打请求日志、耗时、权限、接口限流等通用逻辑。那么接下来我会和你一起实现一个filter组件,同时让你了解到,它是如何从0到1搭建起来的,...

【深入理解Go】协程设计与调度原理(下)

2021-09-21
阅读 5 分钟
3.6k
在上一篇文章中,我们讲述了基本的调度流程。但是我们没有解决如果协程内部如果存在阻塞的情况下该如何处理。比如某个G中存在对channel的收发等操作会发生阻塞,那么这个协程就不能一直占用M的资源,如果一直占用可能就会导致所有M都被阻塞住了。所以我们需要把当前G暂时挂起,待阻塞返回之后重新调度这个G来运行。

【深入理解Go】协程设计与调度原理(上)

2021-09-19
阅读 6 分钟
7k
协程是更轻量的用户态线程,是Go语言的核心。那么如何去调度这些协程何时去执行、如何更合理的分配操作系统资源,需要一个设计良好的调度器来支持。什么才是一个好的调度器?能在适当的时机将合适的协程分配到合适的位置,保证公平和效率。

【业务学习】分库分表回顾

2021-09-16
阅读 4 分钟
3.1k
随着公司业务快速发展,数据库中的数据量猛增,访问性能也变慢了,优化迫在眉睫。分析一下问题出现在哪儿呢? 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。针对生产环境...

Go多协程并发环境下的异常处理

2020-08-19
阅读 4 分钟
23k
在Go语言中,我们通常会用到panic和recover来抛出错误和捕获错误,这一对操作在单协程环境下我们正常用就好了,并不会踩到什么坑。但是在多协程并发环境下,我们常常会碰到以下两个问题。假设我们现在有2个协程,我们叫它们协程A和B好了:

【分布式系统遨游】分布式高可靠之负载均衡

2020-05-07
阅读 3 分钟
1.9k
负载均衡是分布式可靠性中非常关键的一个问题或技术,在一定程度上反映了分布式系统对业务处理的能力。比如,早期的电商抢购活动,当流量过大时,你可能就会发现有些地区可以购买,而有些地区因为服务崩溃而不能抢购。这,其实就是系统的负载均衡出现了问题。那么,究竟什么是负载均衡呢?接下来我们一起来看一看。

【分布式系统遨游】分布式数据复制

2020-05-06
阅读 3 分钟
2.4k
我们在上一篇文章中谈到了分布式数据的分片存储技术,其核心在于将原数据划分为多个数据子集,然后将每个子集分散到不同的集群节点上存储,以实现负载均衡。那么,这里其实是有一个问题的。由于每个节点上面的数据完全没有交集,假设其中一个节点挂了,那么这个节点上的数据就丢失了。所以,我们需要一种技术方案,在数...

【分布式系统遨游】分布式数据存储

2020-05-05
阅读 3 分钟
1.7k
由于现在我们有了很多个节点,我们就可以把之前一台机器上面的数据,打散到各个分布式集群中的节点上面去,以充分利用集群资源。其流程大概如图所示:比如,12306网站可以将京广线的订单数据存在机器A上,京沪线的订单数据存在机器B上,这样如果用户想购买京广线的火车票,只需要从机器A查询即可,其时间复杂度相比全量...

【分布式系统遨游】分布式计算

2020-04-30
阅读 5 分钟
2.6k
随着计算技术的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成。怎么解决这个问题呢?当然是把这些问题分成多份,在不同的机器上去解决,众人拾柴火焰高嘛。而分布式计算就是将该应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提...

【分布式系统遨游】分布式通信

2020-04-29
阅读 5 分钟
3.3k
我们之前在讲分布式资源调度的时候,把分布式系统中的各个节点与操作系统的进程做了类比。我们知道,操作系统的进程之间由于需要数据的交换,是需要进程通信机制的。那么同理,分布式系统之间同样需要通信。在业务层面,每个分布式系统一般都承载着一个微服务,所以,微服务之间也一定是需要通信的。比如,我们各条业务...

【分布式系统遨游】分布式资源调度

2020-04-23
阅读 5 分钟
4.6k
我们知道,计算机的出现很大程度上是为了分担人类的工作的。所以,整个计算机体系架构的演化的过程,都离不开对任务与资源这两个因素的考虑。如何利用最少的资源,运行最多的任务,且耗时最短,这是一直以来伴随我们以及科学家的难题。对于单机系统来说,从最早的单道程序设计技术、到多道程序设计技术、到现在的多核并...

【分布式系统遨游】分布式事务

2020-04-22
阅读 5 分钟
1.7k
通常,这种不同业务会运行在不同的机器上边的,假设这两个动作是在同一台机器上发生的,我们进行操作的时候是不是需要保证订单操作和库存操作动作一致才能保证这个交易的准确性(通常我们用mysql事务来保证),如果这个问题放到了分布式结构中,我们是不是同样需要保证操作的正确性,那么这个问题,就是分布式事务。

【分布式系统遨游】分布式经典架构

2020-04-19
阅读 5 分钟
3.4k
我们知道,分布式系统就是将具有独立计算能力的系统单元,部署在不同的机器上。那么,如何有效的管理这些机器之间的协同工作,就是一个很大的难题。目前,大体有两种典型的分布式系统架构:集中式与非集中式。

【Go语言踩坑系列(十)】Channel(下)

2020-04-12
阅读 4 分钟
2.6k
我们在主协程中创建一个通道,并且开了一个子协程往通道里写入一个数据,然后再在主协程读取这个数据,且在读取之前打印通道的有效长度。由于我们在上一节说过,这是一个非缓冲通道,如果我们要向里面写入数据,必须得有接收方同时来接收才可以,否则就会发生死锁。

【Go语言踩坑系列(九)】Channel(上)

2020-04-12
阅读 4 分钟
4.3k
我们知道,Go实现了两种并发形式,第一种是多线程共享内存,其实就是Java,C++等语言的多线程并发,通过锁来进行访问。另一种则是Go特有的CSP(communicating sequential processes)并发模型。

【Go语言踩坑系列(八)】Goroutine(下)

2020-04-06
阅读 4 分钟
2.7k
现在我们分析一下这段代码,循环十次,每次使用go语句创建一个协程,并在每个协程中打印i值,注意这个i值是这条打印语句真正得到执行的时候,从外部for语句代码块中取的的当前的i值。那么为什么在上一篇文章中,我们说每次打印的i值是不确定的呢?答案就在于Go协程的调度机制的不确定性。下面我们从Go协程演化的角度,来...

【Go语言踩坑系列(七)】Goroutine(上)

2020-04-04
阅读 4 分钟
3.6k
这个时代主要标志为批处理。我们都知道早期的计算机就是穿孔打卡来运行的,需要人工去做输入输出的处理工作,计算机只进行了计算,而且每次都只能执行一个流程,然后循环往复,这个大流程下计算机很大程度上是没有执行的,所以。为了解决这个问题,出现了批处理,它把之前一次执行的任务聚合起来,统一传输给计算机处理...

【Go语言踩坑系列(六)】面向对象

2020-03-29
阅读 7 分钟
3.2k
首先,我们需要明确面向对象的思想是包含各种独立而又互相调用,这就需要一个承载的数据结构,那么这个结构是什么呢?很显然,在GO语言中就是结构体。其次,结构体作为一种数据结构,无论是在C还是C++还是Go都发挥了极其重要的作用。另外,在Go语言中其实并没有明确的面向对象的说法,实在要扯上的话,我们可以将struct...

【Go语言踩坑系列(五)】错误与异常处理

2020-03-28
阅读 5 分钟
2k
任何一行代码都可能存在不可预知的问题,而这些问题就是bug的根源。为了妥善处理这类问题,我们需要编写一些代码,这类代码被称为运维代码。通常情况下,我们需要发现问题、判断问题的种类、然后根据问题的种类,分别进行响应与处理。这些处理可能是写入日志、也可能是直接让代码停止运行,这些都视你的业务逻辑而定。这...

【Go语言踩坑系列(四)】字典

2020-03-21
阅读 5 分钟
1.9k
声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 要点 本文关注Go语言map相关的语言特性。 map初始化与内存分配 首先,必须给map分配内存空间之后,才可以往map中添加元素: {代码...} 如果你使用的是make来创建一个map,Go在声明的同时,会自动为map分配内...

【Go语言踩坑系列(三)】数组与切片

2020-03-21
阅读 6 分钟
3.2k
Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层原始数据有着相同的内存结构,在上层,因为语法的限制而有着不同的行为表现。

【Go语言踩坑系列(二)】字符串

2020-03-15
阅读 5 分钟
1.9k
计算机是为人类服务的,我们自然有表示我们人类所有语言与符号的需求。由于计算机底层实现全部为二进制,为了用计算机表示并存储人类文明所有的符号,我们需要构造一个“符号” => “唯一编码”的映射表,且这个编码能够用二进制来表示。这样就实现了用计算机来表示人类的文字与符号。最早的映射表叫做ASCII码表,如:a =...

【Go语言踩坑系列(一)】基本数据类型

2020-03-14
阅读 3 分钟
1.4k
初始化顺序:当前包级别变量 -> 导入外部包的init() -> 当前包内的init() -> main()。通常可将一个包导入但是不使用的方式,初始化某些配置数据。 下面这段代码会运行config包和model包下的init()方法:

【2019年度总结】重生

2019-12-31
阅读 6 分钟
3.4k
1月。刚刚结束为期五个月的实习,我回到杭州暂做休整。这五个月,是我一生中成长最快的五个月,也是我一生中受到打击最大的五个月。在校期间,我通过两年时间积累起来的自信一落千丈,我感受到我的能力是那样一文不值、身体是如此的弱不禁风。那一刻我才明白,我不过是一只井底之蛙罢了。我折服于雷总能力的广度与深度、...