Golang的strings.go源码解析 - Rabin-Karp了解一下?
strings包是我们经常在处理字符串的时候要用的,这次我们来看看它其中的一些方法具体是如何实现的。我就找到其中常用的几个方法,然后针对其中比较难的部分还有应用到一些特别算法的部分进行分析。
ToUpper先来看个简单的ToUpper,将所有字符转换成大写。这个如果让我们自己实现也没有什么难度,就是遍历每个字符转换成大写就可以。
12345678910111213141516171819202122232425262728// ToUpper returns a copy of the string s with all Unicode letters mapped to their upper case.func ToUpper(s string) string { isASCII, hasLower := true, false for i := 0; i < len(s); i++ { c := s[i] if c >= utf8.RuneSelf { isASCII = false break } has ...
Golang的slice
今天来说个简单的,也不简单的东西,那就是切片。slice对于golang来说那真的是一个非常常用的东西了,很多地方都会用到它,今天就来说说,slice底层是如何实现的,又有哪些坑是需要提前注意的。
slice结构很多第一次接触golang的同学都会认为,数组和切片是差不多的东西,其实不是的,切片是数组的封装。
12345type slice struct { array unsafe.Pointer len int cap int}
上面这个就是slice的结构,顺便说一下:slice的源码位置是:go/src/runtime/slice.go
其中array是一个指针,指向底层的数组
len代表slice的长度
cap代表slice的容量
为什么会有长度和容量这个区分呢,这两个东西是用来干什么的呢?我们往下看。
slice的长度和容量我们先来看一个最简单的案例
1234sli := make([]int, 2)fmt.Printf("len=%d cap=%d\n", len(sli), cap( ...
浅入深出ETCD之【集群部署与golang客户端使用】
之前说了etcd的简介,命令行使用,一些基本原理。这次来说说现实一点的集群部署和golang版本的客户端使用。因为在实际使用过程中,etcd的节点肯定是需要2N+1个进行部署的,所以有必要说明一下集群的部署。
集群部署网上有很多集群部署的教程,有的很复杂,其实对于我们实际使用来说,其实配置并不复杂,下面举例一种最简单的集群配置。(简单到你想不到~)
下载https://github.com/etcd-io/etcd/releases还是在github上面找到需要下载的版本我使用的是etcd-v3.3.13-linux-amd64.tar.gz使用wget下载到linux你喜欢的目录,或者本地下载完成之后上传均可。
部署首先我找了三台机器,对应ip为192.168.4.224192.168.4.225192.168.4.226PS:提醒一下记得开发对应防火墙的端口
然后将下载的文件解压,之后进入解压后的目录,分别使用下面的命令启动。(注意下面的命令对应的是三台不同的机器,你需要修改对应为你自己的ip)
1234567891011121314151617181920212223$ ./ ...
浅入深出ETCD之【raft原理】
这次我们来说说,有关于etcd原理的一些事情。之前我们已经了解到了etcd是一个分布式的k-v存储,那么它究竟是如何保证数据是如何复制到每个节点上面去的呢?又是如何保证在网络分区的情况下能正常工作下去?raft协议到底是什么?带着这些问题我们继续往下看。
raft选举策略我们知道etcd使用raft协议来保证整个分布式的节点网络能正常的运转并且能正确的将数据复制到每个节点上面去。那么什么是raft协议嘞?
首先我们有这样一个背景:raft是想维护整一个网络,其中有一个领导人,这个领导人负责将收到的信息同步给网络中的其他所有节点,从而保证整个网络数据一致。
如果你有一定的英文基础,我建议直接查看下面这个网站,它用动画非常清楚的描述了raft选举的整个过程:http://thesecretlivesofdata.com/raft/
这个其实已经说明的超级棒了,如果你还看不懂,我下面会用最简单的几个要点来进行最简单的说明。
大多数理论首先说明一个理论,叫做大多数理论,很简单,举个栗子:
有10个人,如果你将苹果给其中的6个人(大多数),那么你随机选择5个人,一定有一个人会有苹果。
在 ...
浅入深出ETCD之【简介与命令行使用】
你知道etcd吗?随着k8s的使用广泛之后,etcd被非常多的人所知道,同时又因为它可靠的分布式特性被很多人喜欢。所以,我准备有几篇博文来记录一下,从基本使用到线上部署再到原理分析,做一个系列。那么,今天先来说说它的简介与命令行的使用。
简介ETCD是什么我个人总结为下面用几个要点:
高可用K-V存储,就类似于redis一样的键值对存储。
允许应用实时监听存储中的K-V变化。
能够容忍单点故障,能够应对网络分区。
etcd利用raft在集群中同步K-V信息,raft是强一致的集群日志同步算法。
总结:etcd是一个分布式高可用k-v存储,通过复制达到每个节点存储的信息一致,从而保证高可用。
数据复制这里简单说一下复制的具体流程:
(client为我们的客户端,用来发出存储请求,leader和follower都是etcd的节点)就如图上所看到的,我叫它两段式提交:
客户端请求leader发送存储的数据,然后leader节点要将信息通过日志复制给大多数的follower节点,如上图所示,只需要复制给两个(加上它自己是三个)那么就是大多数节点。
leader当复制完成之后才会本地 ...
Golang指针与unsafe
我们知道在golang中是存在指针这个概念的。对于指针很多人有点忌惮(可能是因为之前学习过C语言),因为它会导致很多异常的问题。但是很多人学习之后发现,golang中的指针很简单,没有C那么复杂。所以今天就详细来说说指针。
指针的使用123a := 1p := &afmt.Println(p)
输出:0xc42001c070
可以看到p就是一个指针,也可以说是a的地址。
1234a := 1var p *intp = &afmt.Println(p)
或者也可以写成这样,因为我知道,在很多人看来,看到*号才是指针(手动滑稽)
123a := 1p := &afmt.Println(*p)
输出:1
然后使用就直接通过*号就能去到对应的值了,就这么简单
指针的限制Golang中指针之所以看起来很简单,是因为指针的功能不多。我们能看到的功能就是指针的指向一个地址而已,然后对于这个地址也只能进行传递,或者通过这个的地址去访问值。
不能像C语言中一样p++,这样移动操作指针,因为其实这样操作确实不安全,很容易访问到奇怪的区域。
不同类型的指针不能相互赋值、转换、比 ...
大话图解golang map源码详解
网上分析golang中map的源码的博客已经非常多了,随便一搜就有,而且也非常详细,所以如果我再来写就有点画蛇添足了(而且我也写不好,手动滑稽)。但是我还是要写,略略略,这篇博客的意义在于能从几张图片,然后用我最通俗的文字,让没看过源码的人最快程度上了解golang中map是怎么样的。
当然,因为简单,所以不完美。有很多地方省略了细节问题,如果你觉得没看够,或者本来就想了解详细情况的话在文末给出了一些非常不错的博客,当然有能力还是自己去阅读源码比较靠谱。
那么下面我将从这几个方面来说明,你先记住有下面几个方向,这样可以有一个大致的思路:
基础结构:golang中的map是什么样子的,是由什么数据结构组成的?
初始化:初始化之后map是怎么样的?
get:如何获取一个元素?
put:如何存放一个元素?
扩容:当存放空间不够的时候扩容是怎么扩的?
基础结构图解这个就是golang中map的结构,其实真的不复杂,我省略了其中一些和结构关系不大的字段,就只剩下这些了。
大话大话来描述一些要点:
最外面是hmap结构体,用buckets存放一些名字叫bmap的桶(数量不定,是2的指数倍 ...
Golang 读写锁RWMutex 互斥锁Mutex 源码详解
Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说了,本文主要侧重于从源码的角度分析这两种锁的具体实现。
引子问题我一般喜欢带着问题去看源码。那么对于读写锁,你是否有这样的问题,为什么可以有多个读锁?有没有可能出现有协程一直无法获取到写锁的情况?带着你的疑问来往下看看,具体这个锁是如何实现的。
如果你自己想看,我给出阅读的一个思路,可以先看读写锁,因为读写锁的实现依赖于互斥锁,并且读写锁比较简单一些,然后整理思路之后再去想一下实际的应用场景,然后再去看互斥锁。
下面我就会按照这个思路一步步往下走。
基础知识点
知识点1:信号量信号量是 Edsger Dijkstra 发明的数据结构(没错就是那个最短路径算法那个牛人),在解决多种同步问题时很有用。其本质是一个整数,并关联两个操作:
申请acquire(也称为 wait、decrement 或 P 操作)释放release(也称 signal、increment 或 V 操作)
acquire操作将信号量减 1,如果结果值为负则线程阻塞,且直到其他线程进行了信号量累加为正数才 ...
小白胡扯设计
小白胡扯设计每周设计灵感
每周积累一点灵感
每周设计灵感 Week1 卡片和弹窗设计
每周设计灵感 Week2 好看的字体
每周设计灵感 Week3 常用的免费 ICON
每周设计灵感 Week4 网站常用配色参考
面向问题编程
面向问题编程Redis
IO多路复用和多线程会影响Redis分布式锁吗?
读书吃饭睡觉
读书吃饭睡觉
程序员真是一个活到老学到老的职业,读书的时候别忘记吃饭睡觉哦~
《笨开发学习操作系统》
操作系统的学习总是让人觉得自己像个“笨蛋”,希望通过编写这个专栏来让自己变“聪明”一点 😂,希望你也可以
《笨开发学习操作系统》0 前言
《笨开发学习操作系统》1 启动
《笨开发学习操作系统》2 进程
《笨开发学习操作系统》3 内存
《笨开发学习操作系统》4 进程间通信
《笨开发学习操作系统》5 文件系统
《笨开发学习操作系统》6 输入输出系统
《笨开发学习操作系统》7 网络
《Go 单元测试指北》
Go 单元测试的小总结
《Go 单元测试指北》0 前言
《Go 单元测试指北》1 数据层
《Go 单元测试指北》2 逻辑层
《Go 单元测试指北》3 接口层
《Go 单元测试指北》4 其他小技
感谢您为本博客的长远发展做出的贡献
感谢您为本博客的长远发展做出的贡献
本博客不会悬挂任何广告,若发现评论中含有任何广告,请勿点击,长远发展源于我的热爱和你的投币~ 😄
本博客当前主要开销
云服务器 (约 300/年)
图床 CDN 存储和流量 (约 24/年)
域名 (约 72/年)
评论资源 (约 80/年)
….
赞助者
赞助时间
赞助者
金额
友链
2019 年 06 月 27 日
好大一瓶芬达
20
-
2022 年 06 月 14 日
李*双
1
-
2023 年 03 月 12 日
黄*博
66
-
2023 年 04 月 28 日
张*恒
72
-
赞助方式
微信
支付宝
赞助时记得备注昵称或者友链 📮