01 2021 档案

map的value不能取址问题
摘要:1 如果map的value是struct,则需要是指针类型,否则的话不能对结构体的某个字段单调赋值,只能整体赋值,因为map扩容的时候要变址 package main import "fmt" type person struct { name string age int sex string } 阅读全文

posted @ 2021-01-31 22:27 吃我一枪 阅读(138) 评论(0) 推荐(0) 编辑

原子操作
摘要:1 1 增和减 add将一个int64的变量原子的增加5,减操作用补码来实现,atomic.AddInt64(&counter, 5) 2 比较并交换(compare and swap 简称 CAS) CompareAndSwapInt32函数接受三个参数。第一个参数的值应该是指向被操作值的指针值。 阅读全文

posted @ 2021-01-31 21:13 吃我一枪 阅读(335) 评论(0) 推荐(0) 编辑

责任链模式
摘要:1 在gin中通过Next()函数来调用前缀树最下面的处理链上的函数,主要是中间件来调用的,如日志中间件Logger(),自己的路由函数也可以调用,但一般不用,因为自己定义的路由函数大多是顺序执行, 特别注意处理链上的函数实际上并不是严格顺序执行的,通过改变Next()在函数中调用的位置可以直接改变 阅读全文

posted @ 2021-01-25 12:10 吃我一枪 阅读(118) 评论(0) 推荐(0) 编辑

go内存池Pool
摘要:1 go提供的sync.Pool是为了对象的复用,如果某些对象的创建比较频繁,就把他们放入Pool中缓存起来以便使用,这样重复利用内存,减少GC的压力, package main import ( "errors" "io" "log" "math/rand" "sync" "sync/atomic 阅读全文

posted @ 2021-01-22 13:18 吃我一枪 阅读(1060) 评论(0) 推荐(0) 编辑

索引
摘要:https://www.jianshu.com/p/dd4fe101cffe https://www.jianshu.com/p/d0d3de6832b9 阅读全文

posted @ 2021-01-18 18:41 吃我一枪 阅读(48) 评论(0) 推荐(0) 编辑

面试题
摘要:https://blog.fundebug.com/2019/02/28/what-happens-from-url-to-webpage/ 阅读全文

posted @ 2021-01-18 12:52 吃我一枪 阅读(47) 评论(0) 推荐(0) 编辑

线程切换
摘要:1 前后两个线程属于不同进程。此时,因为资源不共享,所以切换过程就跟进程上下文切换是一样。 2 前后两个线程属于同一个进程。此时,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据 https://blog.csdn.net/weixin_ 阅读全文

posted @ 2021-01-18 12:33 吃我一枪 阅读(358) 评论(0) 推荐(0) 编辑

孤儿进程僵尸进程
摘要:参考: https://www.cnblogs.com/anker/p/3271773.html https://blog.csdn.net/LEON1741/article/details/78142269 阅读全文

posted @ 2021-01-17 11:39 吃我一枪 阅读(57) 评论(0) 推荐(0) 编辑

io调用
摘要:1 参考:https://blog.csdn.net/tjiyu/article/details/52959418 https://ninokop.github.io/2018/02/18/go-net/ 阅读全文

posted @ 2021-01-16 16:54 吃我一枪 阅读(52) 评论(0) 推荐(0) 编辑

io多路复用
摘要:https://juejin.cn/post/6844904200141438984#heading-1 阅读全文

posted @ 2021-01-14 22:16 吃我一枪 阅读(57) 评论(0) 推荐(0) 编辑

MVCC原理
摘要:https://www.cnblogs.com/kismetv/p/10331633.html 阅读全文

posted @ 2021-01-14 21:33 吃我一枪 阅读(53) 评论(0) 推荐(0) 编辑

数据库的键
摘要:超键是具有唯一性的一个或多个列, 候选键满足了超键,但只有一列, 主键是用户用作标识选定的一个候选键, 外键是其它表中的主键,就称这个表的外键, 参考:https://github.com/0voice/interview_internal_reference/blob/master/09.MySQ 阅读全文

posted @ 2021-01-13 22:03 吃我一枪 阅读(155) 评论(0) 推荐(0) 编辑

0号进程
摘要:linux启动的第一个进程是0号进程,是静态创建的 在0号进程启动后会接连创建两个进程,分别是1号进程和2和进程。 1号进程最终会去调用可init可执行文件,init进程最终会去创建所有的应用进程。 2号进程会在内核中负责创建所有的内核线程 所以说0号进程是1号和2号进程的父进程;1号进程是所有用户 阅读全文

posted @ 2021-01-13 14:21 吃我一枪 阅读(488) 评论(0) 推荐(0) 编辑

面试资料
摘要:1 https://blog.csdn.net/qq_43584847/article/details/106413097 https://www.nowcoder.com/discuss/560662?type=all&order=time&pos=&page=1&channel=-1&sourc 阅读全文

posted @ 2021-01-12 22:20 吃我一枪 阅读(49) 评论(0) 推荐(0) 编辑

物理地址虚拟地址
摘要:物理地址就是,机器内主存的地址,包括RAM和ROM,RAM断电无法保存,即cup运行内存,ROM断电可以保存,如磁盘, 虚拟地址:从CPU到MMU的地址称为虚拟地址,cpu支持的内存空间远远大于机器主存的大小,这些多出来的空间对于程序来说是可以用的,这个时候的所有地址都称为虚拟地址 逻辑地址就是,程 阅读全文

posted @ 2021-01-12 21:17 吃我一枪 阅读(366) 评论(0) 推荐(0) 编辑

进程通信方式
摘要:分高级和低级,高级通信有三类七种, 参考:https://wiki.mbalib.com/wiki/%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1 https://www.jianshu.com/p/c1015f5ffa74 阅读全文

posted @ 2021-01-12 20:32 吃我一枪 阅读(143) 评论(0) 推荐(0) 编辑

进程和线程
摘要:1 进程是资源分配的基本单位,由程序段、数据段、PCB(进程的管理者)组成, 线程是资源调度和程序运行的基本单位, 由线程ID、寄存器(程序计数器,状态寄存器,通用寄存器)、栈(核心栈和用户栈,在核心态下用核心栈,用户态下用用户栈)、私有存储区(现场保护信息和与该线程有关的统计信息) 线程自己基本上 阅读全文

posted @ 2021-01-12 15:41 吃我一枪 阅读(173) 评论(0) 推荐(0) 编辑

虚拟内存
摘要:虚拟内存允许执行进程不必完全在内存中。虚拟内存的基本思想是:每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页(Page)。每个页都是一段连续的地址,这些页被映射到物理内存,但是并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的 阅读全文

posted @ 2021-01-12 14:21 吃我一枪 阅读(231) 评论(0) 推荐(0) 编辑

谷歌插件沙拉查词安装
摘要:1 浏览器输入chrome://extensions/ 点击扩展程序,打开网上应用商店直接搜索, 阅读全文

posted @ 2021-01-10 20:54 吃我一枪 阅读(1305) 评论(0) 推荐(0) 编辑

伴鱼面试题
摘要:1 用time.After和context实现,两个方法本质上都是用了context或chan进行传递信息,如果go协程结束了,则用cancel关闭协程或往channel中传入值,同时用case time.After进行阻塞,若go协程超时了,则会走case time.After通道, 两种方法,第 阅读全文

posted @ 2021-01-09 18:42 吃我一枪 阅读(285) 评论(0) 推荐(0) 编辑

异常处理
摘要:1 出现异常时可以用panic输出(这里的输出是把panic里的内存输出到日志上),为了不让程序终止可以用defer函数结合recover,这样程序不会因异常直接退出,recover可以把panic中的报错捕获到,如果不使用recover函数的话遇到panic程序就会终止,用上的话程序并不会立即终止 阅读全文

posted @ 2021-01-08 10:44 吃我一枪 阅读(59) 评论(0) 推荐(0) 编辑

map slice并发不安全问题
摘要:1 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的, 如下会报并发读写的错误fatal error: concurrent map read and map write func main(){ // 创建一个int到int的映射 m := make(map[int]int) // 阅读全文

posted @ 2021-01-07 20:37 吃我一枪 阅读(367) 评论(0) 推荐(0) 编辑

Mutex和RWMutex
摘要:Golang 中的有两种锁,为 sync.Mutex 和 sync.RWMutex。 sync.Mutex 的锁只有一种锁:Lock(),它是绝对锁,也称互斥锁,同一时间只能有一个锁。 sync.RWMutex 叫读写锁,它有两种锁: RLock() 和 Lock(): RLock() 叫读锁。它不 阅读全文

posted @ 2021-01-07 20:28 吃我一枪 阅读(294) 评论(0) 推荐(0) 编辑

内核态和用户态
摘要:http://gityuan.com/2016/05/21/syscall/ 阅读全文

posted @ 2021-01-07 09:41 吃我一枪 阅读(52) 评论(0) 推荐(0) 编辑

runtime源码
摘要:go有自己的调度器,所以在语言级别实现了并发, https://www.infoq.cn/article/r6wzs7bvq2er9kuelbqb 图:https://blog.csdn.net/xclyfe/article/details/50562349 https://blog.csdn.ne 阅读全文

posted @ 2021-01-06 14:46 吃我一枪 阅读(122) 评论(0) 推荐(0) 编辑

goroutine的结束与通信
摘要:结束 两种方法,一是用select+channel的方法,结合WaitGroup可以同时控制多个goroutine结束,也可以在channel中传入time.After的定时器,二是利用Context里的取消函数cancel来处理, 感觉只利用select+channel+定时器进行监控协程不是很完 阅读全文

posted @ 2021-01-06 12:18 吃我一枪 阅读(95) 评论(0) 推荐(0) 编辑

进程线程协程
摘要:1 操作系统为了支持多个应用同时运行,需要保证不同进程之间相对独立(一个进程的崩溃不会影响其他的进程 , 恶意进程不能直接读取和修改其他进程运行时的代码和数据)。因此操作系统内核需要拥有高于普通进程的权限, 以此来调度和管理用户的应用程序。 内存空间被划分为两部分,一部分为内核空间,一部分为用户空间 阅读全文

posted @ 2021-01-05 21:20 吃我一枪 阅读(65) 评论(0) 推荐(0) 编辑

堆和栈
摘要:1 栈 函数调用内部申请到的内存,它们会随着函数的返回把内存还给系统 2 堆 阅读全文

posted @ 2021-01-04 23:01 吃我一枪 阅读(43) 评论(0) 推荐(0) 编辑

array和slice区别
摘要:slice 切片的创建 // slice的创建 // slice的创建有三种方式,一种是通过数组来创建,一种是直接创建切片,一种是用make // slice结构体在runtime包下的slice.go里,它有三个属性, // array是个指针,指向切片中第一个元素的地址,也是返回的结果 // l 阅读全文

posted @ 2021-01-04 21:48 吃我一枪 阅读(525) 评论(0) 推荐(0) 编辑

逃逸分析
摘要:逃逸分析的好处: 1 逃逸分析的好处是为了减少gc的压力,不逃逸的对象分配在栈上,当函数返回时就回收了资源,不需要gc标记清除。 2 逃逸分析完后可以确定哪些变量可以分配在栈上,栈的分配比堆快,性能好(逃逸的局部变量会在堆上分配 ,而没有发生逃逸的则有编译器在栈上分配)。 3 同步消除,如果你定义的 阅读全文

posted @ 2021-01-04 13:58 吃我一枪 阅读(299) 评论(0) 推荐(0) 编辑

单例模式
摘要:为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。为了确保对象的唯一性,我们可以通过单例模式来实现, 1 使用如下的方式,每次都会赋值一份数据,但事实上并没有这个必要,浪费了内存, type 阅读全文

posted @ 2021-01-01 17:38 吃我一枪 阅读(80) 评论(0) 推荐(0) 编辑

WaitGroup用法
摘要:1 Add()用来设置要等待的goroutine的数量,不能为负,Done()用来表示goroutine已经完成了,减少一次计数器,Wait()用来等待所有需要等待的goroutine完成。特别注意这个传递的时候要传指针,传值的话是错误的, package main import ( "fmt" " 阅读全文

posted @ 2021-01-01 12:09 吃我一枪 阅读(352) 评论(0) 推荐(0) 编辑

select+chan控制goroutine结束
摘要:1 一旦向chan中写入值了,select就执行之前阻塞的该通道,执行完后,再执行return,结束goroutine, func main() { stop := make(chan bool) go func() { for { select { case <-stop: fmt.Println 阅读全文

posted @ 2021-01-01 11:42 吃我一枪 阅读(220) 评论(0) 推荐(0) 编辑

导航