深度思维者

永远年轻,永远热泪盈眶

06 2021 档案

摘要:1.前言 所谓读写锁RWMutex,完整的表述应该是读写互斥锁,可以说是Mutex的一个改进版,在某些场景下可以发挥更加灵活的控制能力,比如:读取数据频率远远大于写数据频率的场景。 比如,程序钟写操作少而读操作多,简单的说,如果执行过程时1次写然后N次读的话,使用Mutex这个过程将是串行的, 因为 阅读全文
posted @ 2021-06-30 08:04 failymao 阅读(383) 评论(0) 推荐(0) 编辑
摘要:前言 互斥锁是在并发编程中对共享资源进行访问控制的主要手段,Go语言对其提供了非常简单的Mutex,Mutex是一种数据结构, 对外暴露了两个方法Lock(),Unlock(),分别用于加锁和释放锁。 Mutex使用起来非常方便,但其内部实现却复杂得多,这包括Mutex的几种状态。 另外,我们也想探 阅读全文
posted @ 2021-06-29 08:13 failymao 阅读(1027) 评论(0) 推荐(1) 编辑
摘要:前言 如何给一个外行人说清楚什么是单体架构,什么是集群,分布式,以及高可用,低耦合,高内聚这些专有名词及他们得原理呢? 首先这些名词都是概念得东西,没有明确的一个定义 。 单体架构 家里生小宝宝啦,由于自己没有照顾小宝宝的经验,所以请了位经验丰富的月嫂。 这位月嫂从买菜,到做饭,洗衣,拖地,喂奶,哄 阅读全文
posted @ 2021-06-28 07:22 failymao 阅读(286) 评论(0) 推荐(0) 编辑
摘要:1.前言 range 是Go语言提供的一种遍历手段,可以操作的类型有Array, Slice, Map, Channel. 2.常见的使用技巧 遍历切片时使用正确的姿势是通过索引取值 BadGood func RangeSlice(slice []int) { // 遍历时,其实index不需要,要 阅读全文
posted @ 2021-06-26 23:36 failymao 阅读(365) 评论(0) 推荐(0) 编辑
摘要:又一个周五,总是让人有些期待。 今天说一下职场中第一次和老板见面如何优雅的跟老板打招呼。 作为一个近几年换过好几个工作的老油条的人来讲,有一些自己的看法 还是从今天的事情说起, 昨天leader说大老板明天要来公司,具体是来干什么,咱也么问,反正肯定不是特地来看我的。入职三个月,包括面试,都没和这个 阅读全文
posted @ 2021-06-26 12:23 failymao 阅读(2093) 评论(0) 推荐(0) 编辑
摘要:1. 前言 select是Golang在语言层面提供的多路IO复用的机制,可以检测多个channel是否准备就绪(即是否可读或可写)。 本节试图通过源码总结其实现原理,从而发现一些使用误区或解释一些不常见的现象 2. 一些常见使用场景 当程序中使用多个case语句时,会随机选择一个进行执行 pack 阅读全文
posted @ 2021-06-25 22:25 failymao 阅读(494) 评论(0) 推荐(0) 编辑
摘要:前言 仓库(Repository) 源仓库 开发者仓库 分支(Branch) 永久性分支 暂时性分支 工作流(workflow) 总结 前言 (本文假设各位已经对基本git的基本概念、操作有一定的理解,如无相关git知识,可以参考Pro Git这本书进行相关的学习和练习) 很多项目开发都会采用git 阅读全文
posted @ 2021-06-24 23:01 failymao 阅读(2064) 评论(0) 推荐(1) 编辑
摘要:1.起因 这个问题要从今天刚遇到的事儿说起,昨晚代码出了个乌龙事件,本来正在dev分支进行新功能的开发,但是测试出现的问题是在release 分支上,当时就想到使用stash 将正在开发的dev已经修改的代码 暂时存下来,然后切换到master,重新checkout -b 一个新的fix branc 阅读全文
posted @ 2021-06-24 22:09 failymao 阅读(1687) 评论(0) 推荐(2) 编辑
摘要:git tag版本代码快速修复 实际生产开发中,遇到突发情况,需要紧急修复线上bug,但是灰度环境(或者其他预生产测试环境)已经存在多个新功能的代码了,这时候我们可能选择直接在生产tag版本的代码上进行修复并发布。 local_branch : 本地分支名 tag_name : 生产tag分支 1. 阅读全文
posted @ 2021-06-24 21:17 failymao 阅读(609) 评论(0) 推荐(0) 编辑
摘要:版本 当前更新版本:2021-04-23 版本地址:commit:#114 如果您发现任何更新、问题或改进,请随时 fork 和 PR Please feel free to fork and PR if you find any updates, issues or improvement. 目录 阅读全文
posted @ 2021-06-23 11:36 failymao 阅读(340) 评论(0) 推荐(0) 编辑
摘要:1.前言 defer语句用于延迟函数的调用, 每次defer会把所在函数压入栈中, 函数在返回前再把延迟函数取出执行。 defer 函数所在的函数称为主函数, defer语句关联的函数称为延迟函数 延迟函数可能有输入参数,这些参数可能来源于定义defer的函数,延迟函数也可能引用主函数用于返回的变量 阅读全文
posted @ 2021-06-22 23:36 failymao 阅读(456) 评论(0) 推荐(0) 编辑
摘要:1. string概念 Go标准库builtin给出了所有内置类型的定义。 源代码位于src/builtin/builtin.go,其中关于string的描述如下: // string is the set of all strings of 8-bit bytes, conventionally 阅读全文
posted @ 2021-06-22 07:47 failymao 阅读(557) 评论(0) 推荐(0) 编辑
摘要:1. iota 概述 iota 常用于const表达式中,并且其值是从0开始的,const声明块中每增加一行iota值自增1. 使用iota可以简化常量的定义,但其规则需要牢牢记住。 2. 使用 2.1 日志模块中使用如下代码 type Priority int const ( LOG_EMERG 阅读全文
posted @ 2021-06-21 07:39 failymao 阅读(164) 评论(0) 推荐(0) 编辑
摘要:概述 Go的struct声明允许字段附带Tag来对字段做一些标记 该Tag 不仅仅是一个字符,其主要的作用是用于反射场景, reflect包中提供了操作Tag 的方法,所以Tag的写法也要遵循一定的规则 Tag的本质 2.1 Tag规则 Tag本身是一个字符串,但字符串中却是:以空格分隔的 key: 阅读全文
posted @ 2021-06-20 08:38 failymao 阅读(116) 评论(0) 推荐(0) 编辑
摘要:1. map数据结构 Map使用的哈希表作为底层实现,一个哈希表里可以有多个哈希表节点,也叫bucket,而每个bucket就保存了map中的一个或一组键值对。 map的数据结构由 runtime/map.go:hmap定义: type hmap struct { count int // 当前保存 阅读全文
posted @ 2021-06-19 12:25 failymao 阅读(5152) 评论(0) 推荐(1) 编辑
摘要:1. 前言 Slice又称动态数组,依托数组实现,可以方便的进行扩容、传递等,实际使用中比数组更灵活。 正因为灵活,如果不了解其内部实现机制,有可能遭遇莫名的异常现象。Slice的实现原理很简单,本节试图根据真实的使用场景,在源码中总结实现原理。 2 Slice实现原理 Slice依托数组实现,底层 阅读全文
posted @ 2021-06-17 23:04 failymao 阅读(290) 评论(0) 推荐(0) 编辑
摘要:1. chan数据结构 src/runtime/chan.go:hchan定义了channel的数据结构,如下 type hchan struct { qcount uint // 当前队列中剩余元素个数 dataqsiz uint // 环形队列长度,即可以存放的元素个数 buf unsafe.P 阅读全文
posted @ 2021-06-17 07:08 failymao 阅读(543) 评论(0) 推荐(0) 编辑