自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 资源 (1)
  • 收藏
  • 关注

原创 Golang 闭包

Golang中函数是头等对象,可以当做返回值,可以做参数传递,可以绑定到变量,这样的函数为fanction value,是一个指针,但是并不直接直接指向函数入口,指向一个fancval struct。函数体内只有一个fn uintptr,指向函数的入口地址。为什么使用一个二级指针? 解决闭包,不同的捕获变量Golang 闭包闭包= 函数+函数外变量的引用(捕获变量) DX寄存器保存addr和变量偏移闭包就是有捕获列表的fanction value(保证捕获变量在外层函数与闭包函数中的一致性)pa

2021-04-13 22:33:20 121

原创 MySql知识点

Mysqlsql语句:DDL数据定义语言 DML数据操作语言 DQL数据查询语言 DCL数据控制语言登录:mysql -uroot -ppassword命令行结束 (;)mysql架构:C -> S -> 存储引擎客户端向数据发送请求客户端 : 连接器 控制用户登录 连接​ 分析器:词法语法分析​ 优化器:优化语句,规定执行流程CBO RBO成本 规则​ 执行器:SQL语句的实际执行存储引擎:innodb架构innodb架构分为两块,内存和磁盘中的结

2021-04-06 16:27:17 141

原创 golang mutex

mutex// A Mutex is a mutual exclusion lock.// The zero value for a Mutex is an unlocked mutex.//// A Mutex must not be copied after first use.type Mutex struct { state int32 sema uint32}state表示锁当前的状态,0值为未上锁的锁sema用作信号量,通过PV操作在等待队列中阻塞唤醒goroutine,

2021-04-06 16:21:47 145

原创 分布式锁

分布式锁使用redis实现普通实现:setnx expire? 非原子操作 setnx后 宕机 没有设置过期时间 造成死锁set nx px 原子操作 同时设置key值与过期时间一个客户端通过set nx px 命令首次完成加锁,注意这个值一定要是唯一的,开始执行自己的逻辑另外的客户端获取锁 如果锁还在有效期,则获取失败,否则超时后 key删除 则可以获取到新锁会有一些问题:expire时间的设置。 客户端执行自己的逻辑不知道要多久,那这个过期的时间需要设置成为多少才能够合理呢,如

2021-03-19 15:32:05 108 1

原创 计算机网络

计算机网络tcp udp是传输层协议 FTP http是应用层协议http和https的区别超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在

2021-03-14 10:30:11 56

原创 20210309腾讯面试部分记录

20210309golang的异常 :内置错误类型error,是一个接口类型,自定义的错误类型必须实现为error‘接口,接口内ERROR方法,这样调用总能够通过error)()获取到具体的错误信息而不用关系错误的具体类型,标准库的errorf和errors.new 可以方便的创建error类型的变量golang不支持try catch 来处理异常,引入了defer和panic,recover的方式panic recover机制控制流作用在整个goroutine 调用栈中,当goroutine执行到

2021-03-14 10:28:49 82

原创 golang slice map扩容

golang slice 扩容操作系统预分配的内存规格 byte 8 16 32 64 80 96 112…先求出当前切片容量x,求出append追加后的容量 y判断 x*2 和y 的关系12x < y 使用y, 根据y的个数乘上切片中存储数据类型的大小,求出需要分配的内存,然后再预分配的内存规格选择一个大于的距离最近的规格,然后除以数据类型大小求出个数,即扩容后的个数[]int x=4,y=9 ,4* 2<9, 9 *8=72, 取内存规格中的80, 80 /8 =10,

2021-03-10 15:36:16 788

原创 golang实现(递归+迭代)二叉树的遍历前序中序和后序

二叉树的遍历前序遍历:递归方法:func preorder(root *TreeNode)[]int{ ret := []int{} var order func(*TreeNode) order = func (node *TreeNode){ if node ==nil{ return } // 递归方法 先写入值 再递归左节点 再递归有节点 ret = append(ret,nod

2021-03-07 21:58:01 714

原创 golang leetcode31 下一个排列

func nextPermutation(nums []int) { if len(nums)==1{ return } i , j ,k := len(nums)-2, len(nums)-1, len(nums)-1 for i>=0 && nums[i]>=nums[j]{ //从后向前循环 寻找到第一个非降序数对 即nums[i]>=nums[j] i-- j--

2021-03-07 20:06:35 124

原创 golang 排序算法总结与实现

排序插入排序//InsertSort 插入排序 O(n2) (最好 O(n)) 稳定func InsertSort(arr []int) { n:=len(arr) for i:=1;i<n;i++{ v := arr[i] //保存当前要比较插入的数 for j:=i-1;j>=0;j--{ // 和之前所有数字比较 if v <arr[j]{ // 小于的话 就交换 (所以稳定)

2021-03-06 11:31:18 135

原创 go new和make

new 和 makemake 负责复杂类型 channel slice map的分配内存和初始化任务,会返回类型本身的引用。new 可以为类型进行内存创建和初始化,返回值是所创建类型的指针引用。makemake 只负责三种类型channel slice map 的初始化v1 := make([]int, 1)v2 := make(map[int]bool)v3 := make(chan int)make初始化时,根据类型不同有的需要指定指定长度有的不需要slice 必须传入长度,可以选择传

2021-03-05 09:47:52 88 1

原创 reflect包 学习笔记

reflect包 学习笔记reflect使能够在运行期得知对象的类型信息和内存结构,全部信息来源自接口变量。Type 类型首先区分 Type 和 Kind 。Type:真实类型,静态类型。Kind:基础结构类别,底层类型。type X intfunc main(){ var a X =100 t := reflect.TypeOf(a) // func TypeOf(i interface{}) Type 类型 v := reflect.ValueOf(a)// fun

2021-03-04 10:48:48 147 1

原创 redis cluster

redis cluster呼唤集群:并发量 (10万/s) 数据量 (单机内存不够) 网络流量解决方式:分布式 (简单的认为加机器)集群:规模化需求分布式数据库:数据分区 (顺序分区 哈希分区)哈希分布:节点取余 一致性哈希 虚拟槽分区节点取余: 添加一个节点 会造成80%的数据迁移 建议多倍扩容(迁移50)一致性哈希 哈希环 顺时针决定临近节点 对节点取余的优化 节点伸缩只影响顺时针临近节点​ 一般情况还是使用翻倍伸缩 保证最小迁移数据的同

2021-03-03 15:34:14 149 1

原创 redis sentinel

redis sentinelredis sentinel节点: 监控 多个 高可用 公平 不执行存储 可以执行ping sentinel彼此能够感知客户端从sentinel获取redis信息 sentinel知道主从节点信息故障转移: 自动完成 多个sentinel确认master出现问题 选举一个sentinel作为leader 选出一个从节点作为master并通知其他slave老的master重启复活后称为新的master 的slavesentinel 主要配置sentinel

2021-03-03 11:39:42 59

原创 redis主从复制

主从复制 数据备份 读写分离 高可用 一主多从 一主一从 slave只能有一个master 数据流向只能 从master到slave实现方式:slaveof 配置salveof 命令方式 : 在主client上执行命令 salveof 127.0.0.1:6380 返回OK(但异步执行) 完成数据的复制(全量复制)并且从节点会将自身原先所有数据清除salveof no one 断开主从复制关系 在从节点上执行命令slaveof no one配置文件方式:在配置文件中添加 slaveo

2021-03-02 20:57:15 59

原创 缓存的使用与优化

缓存的使用与优化缓存的受益与成本受益1、加速读写2、降低后端负载成本1、数据不一致 缓存层和数据层有时间窗口不一致(更新策略)2、代码维护成本 (多了一层缓存逻辑)3、运维成本 redis cluster使用场景1、高消耗sql 将结果缓存在redis中 降低后端mysql的负载2、加速请求响应 利用redis、memcache 优化IO的响应时间3、大量写合并为批量写 如计数器操作 可先在redis中使用incr累加再批量写入DB缓存的更新策略

2021-03-02 16:13:05 120

原创 GORM

GORMObject Relational Mapping (将一个结构体数据类型映射为数据库中的一条数据)数据表 <-> 结构体数据行 <-> 结构体实例字段 <->结构体字段优点:提高了开发效率缺点:牺牲执行性能,牺牲灵活性,弱化SQL能力安装 go get -u github.com/jinzhu/gormgorm中为不同数据库包装了不同的驱动mysql : github.com/jinzhu/gorm/dialects/mysql// impo

2021-03-01 18:58:03 410

原创 GO GMP调度器

GO 协程调度器原理与GMP设计思想Golang 调度器的由来Goroutine GMP模型的设计思想GMP调度场景的全过程分析掌握golang协程调度器原理 为什么golang协程的调度是很快的调度器的由来单进程时代的问题:单一执行流程,计算机只能一个一个任务进行处理;进程阻塞会带来cpu 的浪费多进程多线程的问题:​ 设计变得复杂: 进程线程数量越多,切换成本越大,造成cpu性能的浪费​ 线程伴随同步竞争 锁,

2021-03-01 18:54:53 184

原创 Golang GC笔记整理

GO GC三色标记和混合写屏障v1.3 之前使用标记清除法v1.5 三色标记法v1.8 混合写屏障关键词:垃圾回收 自动释放 内存管理 三色标记法 STW(stop the world)v1.3 标记清除法1、暂停业务逻辑(stw)2、根据对象之间的引用关系找出可达对象和不可达对象,并标记需要保留的对象3、清除未被标记的对象。4、停止暂停,程序继续(或3 4 互换,缩短STW的范围,提升些许的效率。)缺点:STW会让程序暂停,出现程序卡顿,影响了语言的性能(**)标记需要扫描整个

2021-03-01 18:50:57 149

原创 C++ STL记录

STL六大部件:1、容器,2、分配器,3、算法,4、迭代器,5、适配器,6、仿函数。1、容器顺序式容器:array,vector,list,forward_list,deque关联式容器:set,multiset,map,multimap,unordered_set,unordered_maparray:使用 array 容器类型时,需要在源文件中包含头文件 array。array相当...

2020-04-20 21:54:29 108

原创 ubuntu网络无法连接

问题是 在虚拟机上安装ubuntu18后,笔记本使用的是无线网卡,ubuntu没有检测到网络适配器,右上角网络标识没有出现,在设置的network中只有vpn和代理器两个选项,没有出现正常的网路连接选项。首先在ubuntu关机的条件下,更改虚拟机设置,虚拟机的网络适配器选项要是桥接模式,并且要选择复制网络的连接状态,在虚拟机编辑选项中,打开虚拟网络编辑器,点击右下角更改设置,将vmnet0的信息...

2020-04-17 14:24:38 1275

原创 C++多线程 互斥量、死锁

在多线程的使用中,如果我们创建了多个线程,多个线程之间的执行顺序是由cpu来完成调度的,因此我们如果需要在多线程中进行数据共享和通信,就需要注意数据安全的问题,有可能我在一个线程中正在执行对数据的操作,此时cpu通过上下文切换,把当前线程切换掉了,开始执行了别的线程,而别的线程本来希望的是拿到我处理过后的数据,而现在拿到的数据是还没有处理完成的数据,这样当然就出现了数据传输的错误,这样的错误一般出...

2020-04-13 20:25:08 172

原创 C++ 并发/并行 线程/进程

并发:并发是一种现象,我们每一时刻只能执行一种任务,但我们需要处理多个任务的时候,我们能够快速的这些任务之间进行切换,一会执行A,一会执行B,这就是并发。并发是由处理器完成的,cpu在不同的进程之间执行调度,完成上下文切换,宏观上我们看到的是多个进程在同时的执行,但微观上,其实不同的进程的执行的时间段是不同,但肯定的是同一时间只有一个进程时正在执行。并发在单核处理器和多核处理器上都存在。并行:...

2020-04-11 20:34:19 293

原创 C++ 多线程

在c++11中,标准库增添了多线程的相关,方便了我们的很多操作,我们只需要在头文件引入 thread ,就可以使用其中的方法。创建线程我们只需要使用thread类就可以完成一个线程的创建,thread需要传入参数,我们必须给他一个可调用的对象,这个对象可以是一个函数,lambda表达式,也可以是类对象.如 thread mythread(myfunction);如果我们传入的这个函数,...

2020-04-11 20:10:18 66

原创 C++ getline()

getline在c++库中可以找到两个版本第一个是在istream的库中,第二个是在string库中声明如下std :: istream :: getlineistream&getline(char * s,streamsize n);istream&getline(char * s,streamsize n,char delim);官方给出的注释是从流中提取字符作为未格式化的输入,并...

2020-04-09 20:26:36 751

原创 C++ 关键字

2020-04-08 16:56:11 50

原创 C++ iterator小记录

1、iteratoriterator可以理解为是一种泛化的指针,其在某些方面类似于下标操作,但是很多容器中我们无法使用下标对容器中的元素进行访问,这时候就需要使用到迭代器。为了更好的使用容器,迭代器起到了连接算法与容器之间的桥梁的作用,当我们使用算法时,需要知道当前算法需要的传来的参数的各种类型,这时候就需要用到iterator的属性来告诉我们这些类型。iterator有五个类型,五种固有属性...

2020-04-02 17:06:36 133

原创 C++ &&与||的短路

因为今天在leetcode上看到一道题,把我整蒙了。面试题64.:求 1+2+…+n 。要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。猛地一看是一个很简单的问题,但是其中的限定条件真让人头大,在偷看了题解后,才回想起来这个小知识点——&&的短路特性逻辑运算符&&的作用是 表达式1 &amp...

2020-03-09 22:05:20 1334

原创 C++ 字符串类型转整形 [atoi()、stoi()以及stringstream]

**string->int的三种方法**1、atoi()原型:int atoi(const char *nptr),输入是const char * 的类型,在使用时需要用string.c_str()将string类型转换为const char *例如:string str=“17”;int a= atoi(str.c_str());//输出a=17;atoi()没有安全性...

2020-03-03 23:14:28 1193

原创 C++字符串类中insert常见用法总结

今天用到了insert其中的一个用法 在指定位置插入一个char,结果用的时候和用法中在指定位置插入string用混了。所以打算整理一下insert的常见用法,也让自己记忆更深刻一点。1,//basic_string& insert( size_type index, size_type count, CharT ch );//在字符串中第index个位置插入count个字符‘ch’...

2020-02-26 17:38:23 4387

原创 C++运算符的重载

运算符包含有很多,但在预定义时很多运算符只能完成单一的运算任务,运算符的重载就是为了扩展运算符的作用范围,使他完成一些我们想让他完成的任务,所以我们需要对其进行重载操作,比如“+”,我们想让其完成两个对象的+ 操作, 在原有预定义的基础就已经做不到,因此我们需要重新对其进行定义,完成两个对象的+操作。 并不是所有的运算符都能重载,能够完成重载的运算符有:**+ - * / % ...

2020-02-09 18:09:21 128

原创 C++引用的简单理解、引用与指针

引用的简单理解引用,直接来说,就是给变量起了一个小名(别名),我们可以通过这个别名来对其进行操作,这些操作与对变量进行直接操作是完全一样的,其声明格式为 类型 &引用名(小名)=目标变量名。

2020-01-06 17:44:12 140

原创 重装系统过程中遇到的问题和解决方法

第一篇博客,就从装系统开始吧。正好前几天将win10系统重装了一下,在过程中遇到了一些问题,问题都是一些比较常规的问题吧,在此做一个总结。

2020-01-05 11:17:25 2153 1

自行车测速仿真

利用单片机设计,在硬件电路的配合下,完成自行车的测速的仿真。

2019-01-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除