合格Golang程序猿需要掌握的知识
文章平均质量分 52
学习过程中应该记住的一些东西
LSY_HELLOWORLD
这个作者很懒,什么都没留下…
展开
-
Golang实现字典树,寻找公共前缀的字符串
字典树可以用来解决搜索前缀问题例如给若干个不同长度的字符串找出有公共前缀的字符串有几个面试遇到的或者计算身份证号,同样前缀的身份证号有多少个之前牛客模考遇到的此算法在搜索引擎中非常使用,写了前几个字就会弹出来相关搜索。以及在存储大量有重复前缀的数据时可以节省大量空间。查找的时间复杂度就是O(字符串长度)本质上是个树,因此用链表链接。以下代码用字符串来表示,假设只有26个小写字母。package mainimport "fmt"//结构体根据需要自行设置type tree str原创 2021-07-13 23:21:01 · 589 阅读 · 0 评论 -
golang的map的里里外外
哈希表首先说说什么是哈希表。哈希表就是通过一个哈希函数,计算出变量的哈希值然后映射到一个桶bucket上。通常有两种方式:取模法:hash&m与运算:hash&(m-1)为了保证与运算的结果不会有空值,m取值应当为2的n次幂。哈希冲突当计算的哈希值映射到同一个桶上,就说发生了哈希冲突,解决办法如下:开放地址法:把第二个值放在冲突的桶下一个桶拉链法:在冲突桶后面链接一个新桶扩容用了/总数=装载因子 0.65超过装载因子,就需要扩容扩容的时候一次性分配足够多的新桶将原创 2021-07-12 21:05:22 · 238 阅读 · 2 评论 -
网际控制报文协议ICMP的左左右右
ICMPInternet Control Message Protocol,用来发送差错报告报文和询问报文。ICMP报文被封装在IP数据报中发送,不使用传输层的TCP/UDP。差错报告报文终点不可达:当路由器或者主机不能交付数据报时,就向源点发送终点不可达报文。距离分为目的网络不可达、目的主机不可达、目的端口不可达、目的协议不可达、目的网络未知等。源点抑制:当路由器或者主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,告诉源点网络拥塞,应该降低发送速率。时间超过:当路由器转发一个数据报时,原创 2021-07-04 18:44:13 · 188 阅读 · 2 评论 -
路由信息协议RIP协议
RIP路由信息协议RIP(Routing Information Protocol)要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录,称为距离向量D-V。RIP使用跳数作为度量来衡量到达目的网络的距离。路由器到直连网络的距离定义为1路由器到非直连网络的距离定义为经过的路由器数目+1允许一条路径最多包含15个路由器,距离等于16相当于不可达因此RIP只适用于小型互联网RIP认为好的路由就是距离短的路有,因此选择通过路由器数量最少的路由。有多条相等数量,就等价负载原创 2021-07-04 18:11:00 · 1059 阅读 · 0 评论 -
Redis的前前后后左左右右
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。优点运行在内存上,读写性能好,10W/S支持数据持久化支持事务支持主从复制数据结构丰富缺点数据库容量受到物理内存的限制不具备自原创 2021-07-04 17:09:24 · 179 阅读 · 0 评论 -
goroutine的调度模型
goroutinuegoroutinue是Go为了实现高并发提供的用户态线程,是用户自己管理的,运行在内核线程之上。创建的大量的goruntinue会同时运行在一个或者多个内核线程上,因此需要一个调度器来维护管理这些goroutinue,确保所有的goroutinue都有相对公平的机会适用CPU。goroutinue和内核线程的映射关系为M:N,多个gorotinue可以在多个内核线程上运行。GMP模型调度模型由四部分组成,G、M、P、schedt。G代表goroutinue,每个goroutin原创 2021-07-04 15:16:00 · 382 阅读 · 0 评论 -
Mysql的相关面试内容
Mysql分为Server和Engine。Server里包含连接器、词法语法分析器、优化器、执行器和缓存等。Engine包括MyISAM InnoDB等插件式引擎。MyISAM基于ISAM引擎,支持全文检索、数据压缩、空间函数,不支持事务和行级锁,只有表级锁。数据和索引分开存储,数据和索引不在一个文件上;索引采用B+树;写的性能差,因为锁的粒度大,写入需要锁整张表。InnoDB支持事务,支持行级锁,支持外键,实现了四种隔离级别。InnoDB的主键索引称为聚簇索引,主键索引和数据一起放在叶原创 2021-07-03 23:30:41 · 111 阅读 · 0 评论 -
详解DHCP协议的工作过程
DHCP是(Dynamic Host Configuration Protocol)动态主机配置协议,是应用层协议,基于UDP传输,负责给主机分配IP等信息。工作过程租用过程续约过程首先明确DHCP服务器采用67端口,客户端采用68端口,网络中有多个DHCP服务器。租用过程客户端C向网络发送DHCP DISCOVER报文,源MAC地址,事务ID,源端口68,目的端口67,源IP为0.0.0.0,目的IP为255.255.255.255进行广播。网络中的除DHCP服务器外,不会有监听端口6原创 2021-06-18 12:51:51 · 915 阅读 · 0 评论 -
TCP连接过程中的一些知识点
三次握手正常过程中问题,为什么是三次握手?而不是二次也不是四次?阻止重复历史连接同步双方的初始序列号避免资源浪费1.阻止重复历史连接如果只有二次握手,例如在客户端发出syn请求,服务器就返回ack建立连接的情况下,如果:发出了syn请求 seq=1,因为网络阻塞,重发的新的syn请求seq=2,然后旧的syn又先到了服务器,则服务器第二次握手给客户端ack 1+1,认为建立连接但是此时旧连接已经被客户端丢弃了,就会造成连接错误,而如果是三次握手,客户端收到ack 1+1后,发现这不原创 2021-06-16 16:15:29 · 280 阅读 · 2 评论 -
http系列之http1.0,http1.1,http2,https之间的区别与优缺
Http基本概念在计算机世界里两点之间传输文字、图片、视音频等超文本数据的约定和规范。http状态码200 OK 成功如果是非HEAD请求,服务器返回的响应头会有body数据204 No Content 成功,响应头没有body数据206 Partial Content分块或断点续传,成功了一部分3xx 表示客户端请求的资源发生了变动,需要客户端用新的URL重新发送请求获得资源,也就是重定向301 Moved Permanently 表示永久重定向,该请求资源已经不在了,需要用新的URL3原创 2021-06-09 13:55:39 · 704 阅读 · 0 评论 -
Redis能否用作MQ消息队列?
从最简单的开始:List 队列首先,我们先从最简单的场景开始讲起。如果你的业务需求足够简单,想把 Redis 当作队列来使用,肯定最先想到的就是使用 List 这个数据类型。因为 List 底层的实现就是一个「链表」,在头部和尾部操作元素,时间复杂度都是 O(1),这意味着它非常符合消息队列的模型。如果把 List 当作队列,你可以这么来用。生产者使用 LPUSH 发布消息:127.0.0.1:6379> LPUSH queue msg1(integer) 1127.0.0.1:63转载 2021-06-05 16:54:03 · 781 阅读 · 0 评论 -
MQ消息队列的一些东西
什么是消息队列顾名思义,消息队列由消息和队列组成。生产者将消息生产出来存入队列,消费者从队列里取出消息消费掉。演化过程原始模型就是只有一个队列,如果由多个消费者,那他们就是竞争的关系,挨个去队列里取,谁取到了就是谁的,一条消息只能被其中一个消费者消费。如果需要将一份消息分发给多个消费者,并且每个消费者都收到全量的消息,原始模型就无法满足需求。一个可行的方案是:为每个消费者创建一个单独的队列,让生产者发送多份。这种做法比较笨,而且同一份数据会被复制多份,也很浪费空间。为了解决这个问题,就演化出了原创 2021-06-05 16:27:34 · 208 阅读 · 0 评论 -
Redis和MySQL的双写一致性系列问题
1.什么是一致性顾名思义,就是数据的一致性,如果是在分布式系统中,那就是各节点中的数据保持一致。一致性分为强一致性弱一致性最终一致性强一致性:这种是符合用户直观感觉的,就是系统写入什么,读出来的就是什么。读写是实时的,用户体验行好,但是对系统的性能影响非常大。弱一致性:这种级别约束了系统再写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据可以达到一致,但会尽可能的保证在某个时间级别后达到一致状态。最终一致性:这种级别约束了系统在一定时间内,数据可以达到一致性。是业界的大型分布式原创 2021-06-03 15:59:46 · 257 阅读 · 1 评论 -
Golang区别于其他语言的特性
1高并发使用起来很方便,只需要go关键字即可开启一个goroutine,轻量级,效率高2 并发通信传统的并发模型大多是基于共享内存,go靠channel来进行通讯3 特色数据类型slice channel rune uintptrrune 可以存储中文字符 至多4个字节slice 很方便 可以实现栈 和 队列没有class可以用struct和interface和function构成面向对象的一些功能4 多个返回值5 defer6 reflect7 工程管理用目录和包名,自动推原创 2021-06-01 11:42:07 · 162 阅读 · 0 评论 -
Golang的类型断言详解
第二种第三种第四种原创 2021-05-20 16:04:40 · 188 阅读 · 0 评论 -
Golang的panic和recover
函数遇见了panic后就不会继续执行后面的函数,而是开始按顺序执行defer,在defer执行函数的时候,会判断自己这个函数会不会因为panic引起新的panic,如果会的话就把新panic加入到panic链表的头部。加入到头部以后继续执行defer函数,如果defer函数里的panic不是头部的panic,就往下找到那个然后终止掉。意思就是旧的panic已经引起了新的,所以旧的可以终止掉当defer执行完之后,按照从后往前的顺序也就是panic发生的先后顺序打印panic信息。panic的结构原创 2021-05-20 15:19:15 · 291 阅读 · 0 评论 -
Golang的defer详解
defer结构defer的调用过程deferproc函数在调用时会在它自己的两个参数后边开辟一段空间,存放defer函数的参数和返回值。这一段空间会被直接拷贝到defer结构体的后面。deferproc函数执行时会在堆上分配一段空间,用于存放defer结构体,以及函数的大小和返回值defer的函数为闭包函数的情况闭包函数捕获的变量放在堆上,栈里存放变量的地址如果找到捕获变量通过寄存器存储的funcvalue地址,加上偏移量找到捕获变量A的地址最后如果defer的函数里还有参数,是先执行里原创 2021-05-20 14:20:51 · 298 阅读 · 0 评论 -
Golang方法的调用栈以及值和指针的区别
传值的方法调用栈传指针的方法调用栈语法糖编译的时候会自动改变类型如果把函数赋给一个变量或者把方法赋给一个变量再或者把一个闭包赋给一个变量实质上都是通过二级指针先建立一个指针指向函数地址,然后再指向这个指针,每一个变量都会有一个属于自己的指针。指针里存有捕获变量和函数的地址。...原创 2021-05-20 13:54:09 · 129 阅读 · 0 评论 -
Golang函数调用栈
分配给函数的栈空间称为栈帧栈底称为栈基栈顶称为栈指针原创 2021-05-20 13:42:40 · 254 阅读 · 0 评论 -
Golang实现查看程序块运行时间
函数的运行时间的长短是衡量这个函数性能的重要指标,特别是在对比和基准测试中,要得到函数的运行时间,最简单的办法就是在函数执行之前设置一个起始时间,并在函数运行结束时获取从起始时间到现在的时间间隔,这个时间间隔就是函数的运行时间。在Go语言中我们可以使用 time 包中的 Since() 函数来获取函数的运行时间,Go语言官方文档中对 Since() 函数的介绍是这样的。func Since(t Time) DurationSince() 函数返回从 t 到现在经过的时间,等价于time.Now().转载 2021-05-19 18:24:50 · 640 阅读 · 0 评论 -
合格程序猿需要掌握的专业缩写词
1.RT(Respose Time) 响应时间 指系统对请求作出响应的时间。2.(Throughput)吞吐量是指系统在单位时间内处理请求的数量。3.QPS(Query Per Second) 每秒查询率是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准4.API(Application Programming Interface)又称为应用编程接口,就是软件系统不同组成部分衔接的约定。由于近年来软件的规模日益庞大,常常需要把复杂的系统划分成小的组成部分,编程接口的设计十分重要。程序设计的实原创 2021-05-18 20:21:37 · 178 阅读 · 0 评论 -
Golang里make和new的区别
返回值new返回的是地址,make返回的是对象本身参数new 可以针对任何类型make 针对map slice chanmap时添加类型slice时添加类型,添加len长度,cap容量可选chan时添加类型,容量可选,缺省是为无缓冲区的chan作用场景make 在初始化slice map 和chan时经常用到尤其是slice 时 需要初始化容量而其他情况下一般采用:=直接声明并初始化一个变量,而不采用new的方式...原创 2021-05-18 20:17:32 · 133 阅读 · 0 评论 -
Golang里的Slice的一点细节和扩容规则
Slice是什么Slice中文名切片,简单的可以理解为可以变化的数组,Slice的底层指向为一个数组,Slice由三部分组成data 存什么 Len存了多少,长度 cap 能存多少,底层数组的长度不同的切片指向同一个数组时,修改数组或者任意一个切片的内容,其他共用到这个修改内容的元素都会被影响到。append可以往切片里添加元素,当添加的元素不超过cap的长度时,指向的底层数组还是原来那个,修改就会影响别的;一旦超过了cap长度,就会引发扩容,扩容后会指向一个新的底层数组,此时扩容后的切片原创 2021-05-18 19:57:41 · 392 阅读 · 0 评论 -
内存对齐的一些内容
为什么要内存对齐计算机的实际内存的地址并不是连续的,而是分开的。每读取一次,可以获得8个地址,如果不进行内存对齐,读取跨越边界的数据时就要浪费一次读取的时间。CPU想要读取数据就需要通过地址总线把地址传输给内存,内存通过数据总线把数据交给内存。地址总线有几根就可以表示多少位的地址,8根就是256个地址,32根就可以表示4GB个地址。想要数据传输的快,就要加宽数据总线,一字节是8位,想操作4字节就要32根数据总线,8字节就需要64根数据总线,32,64就是所谓的机器字长。类型大小和平台最大对其边原创 2021-05-18 19:42:40 · 87 阅读 · 0 评论 -
Golang里的Mutex互斥锁
Mutex的结构为一个结构体,只有两个变量type Mutex struct{ state int32 sema uint32}state 用来标置锁,为1代表获得锁,为0代表解锁sema是一个信号量,用作等待队列Mutex分为两种模式正常模式一个尝试加锁的goroutinue如果获得锁失败,就会通过原子操作自旋尝试加锁,自旋可以让程序获得更高的吞吐量,因为频繁的挂起和唤醒goroutinue会带来较多的开销,但是又不能无限制的自旋,因此要加入等待队列。如果goroutinue自旋几次原创 2021-05-18 19:31:38 · 149 阅读 · 0 评论 -
什么是内核态和用户态
计算机的组成计算机由运算器,控制器,存储器和输入设备,输出设备组成。其中,运算器是无状态的;控制器配合一部分寄存器,但是寄存器数量很少,而且通常都很容易被修改;输入设备、输出设备只有接受指令的时候才动作。归根结底来说,整个计算机的运行状态几乎完全由存储器和少数几个寄存器控制。也就是说,如果一段程序能够完全控制物理内存,那么它就能做到任意改变计算机的状态。在一开始的DOS系统上,就可以将要执行的应用程序加载变成了操作系统的一部分,然后混合起来运行,哪一段是用户程序、哪一段是操作系统并没有很明确的界限:用转载 2021-05-18 16:23:20 · 6956 阅读 · 0 评论 -
IO多路复用之select,poll,epoll
背景通过操作系统记录的进程控制信息可以找到打开文件描述符表,里面包含着进程打开的文件、创建的socket等。socket的所有操作都需要由操作系统的系统调用来完成。每创建一个socket,就会在文件描述符表中增加一条记录,返回给应用程序的只有一个socket描述符,用于识别不同的socket。每个TCP socket创建时,操作系统都会为其分配一个读缓冲区和写缓冲区,要获得响应数据就需要从读内核空间的读缓冲区拷贝到用户空间,同样想发送数据时,需要把用户空间的数据拷贝到写缓冲区,然后再发送给服务器。原创 2021-05-17 21:52:12 · 137 阅读 · 0 评论 -
上下文和什么时候切换上下文
什么是上下文当一个进程在执行时,CPU的所有寄存器中的值、程序计数器、栈指针等被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。什么时候要切换上下文一,为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其它正在等待 CPU 的进程运行。二,进程在系统资源不足(比如内存不足)时,要等到原创 2021-05-17 17:21:43 · 199 阅读 · 0 评论 -
Go里的协程是什么?
协程的关键思想在于控制流的让出和恢复每个协程有自己的执行栈,可以保存自己的执行现场。可以由用户程序按需创建协程,协程主动让出执行权时,会保存执行现场然后切换到其他协程;协程恢复执行时,会根据之前保存的执行现场,继续执行中断前的任务。这样就实现了既轻量又灵活的由用户态进行调度的多任务模型。因为用户程序不能操作内核空间,所以只能给协程分配用户栈,而操作系统对此一无所知,所以协程又被称为“用户态线程”。...原创 2021-05-17 16:57:40 · 159 阅读 · 0 评论 -
同步和锁的本质
同步在并发场景下,可能出现安全问题。比如在去银行取钱,账户里有500余额,进程A要取200块钱,进程B也要取200块钱。一般流程是,第一步把余额500存入寄存器,第二步在寄存器里减去200变成300,第三步把300写进余额。但是可能在运行了第一步之后在第三步之前,时间片用完,进程从A切换到B,进程B去读取余额也是500,然后放到寄存器里,再减去200,最后将300写入余额。然后进程B结束,进程A恢复,继续执行第三步把300写进余额。但是进程A和进程B都取了200,此时账户的余额为300,而不是10原创 2021-05-17 15:49:18 · 129 阅读 · 0 评论 -
进程和线程的区别,为什么线程切换代价小?
什么是进程一个程序一般对应一个进程,每个程序在执行过程中肯定要获得一些资源,一块属于自己的地盘,因此系统就把这些东西划分出来给一个进程,这个程序的所有操作都在进程里完成。进程就相当于一个工厂,不仅有自己的厂房,所需要的物料、机器以及工人和产品等。因此进程是操作系统进行资源分配和调度的一个基本单位。什么是线程一个进程最少有一个线程,线程可以实现把进程所需要执行的工作再次细分的能力。上面把进程比喻成一个工厂,那么线程就是工厂里的一条流水线,多个线程就是多个流水线,这些流水线相互之间独立,拥有自己加工的数原创 2021-05-17 15:05:01 · 2803 阅读 · 0 评论 -
浅谈虚拟内存是什么
本内容参考于幼麟实验室,知乎,B站都有虚拟内存顾名思义,不是真实的内存。要了解虚拟内存,必须也要了解真实的物理内存地址是怎样的。虚拟内存就是在不同的进程中都使用相同的线性地址,就如同在一个学校里不同教师都有第一排,第二排,而不能统一编号第一到第N排,否则对每个教室来说管理起来会非常混乱。物理地址中每4KB作为一页,以页为单位映射。操作系统以链表的形式记录各个进程的控制信息,进程控制块PCB,进程控制块中存在一个指针,存储的是当前进程“页目录”的物理地址,页目录也是一个内存页,存储一系列指向页表的指针,原创 2021-05-17 14:44:09 · 411 阅读 · 0 评论