- 博客(74)
- 收藏
- 关注
原创 Git基础
1. 环境配置配置用户名git config --global user.name "用户名"配置密码git config --global email "邮箱"注意事项:git config 设置的信息保存在~/.gitconfig文件中git config --list # 查看配置信息 git config user.name # 查看配置信息2. Git工作区、暂存区、版本库工作目录包含 .git文件夹的目录就是工作目录,主要用于存放开发的源代码暂存区
2020-10-17 23:20:04 178
原创 C_关于子函数调用的指针传递和解引用问题
首先以一段代码开始:#include<stdio.h>void Swap(int a,int b){ int tmp; tmp = a; a = b; b = tmp;}int main(){ int a = 1; int b = 2; Swap(a, b); printf("%d\n%d\n", a, b); return 0;}//运行函数..
2018-11-20 15:00:38 2975
原创 Golang_垃圾回收原理
一、什么是GC?内存管理分为自动和手动,C/C++ 采用手动管理内存;像 Java、Go 等有内存分配器和垃圾收集器进行内存分配和回收,其中的垃圾回收器就是 GC二、GC 算法分类追踪式垃圾回收算法(Go 中的三色标记法):核心思想是判断一个对象是否可达,一旦对象不可达就可以在垃圾回收的控制循环里被 GC 回收,对象是否可达?首先,找出所有的全局变量和当前函数栈里的变量,标记为可达;然后,从已经标记的数据开始,进一步标记它们可达访问的变量,以此类推引用计数法三、三色标记清除法:
2021-09-06 17:24:49 250
原创 Golang_栈内存管理
一、栈区和堆区应用程序的内存区分为栈区(stack)和堆区(heap)栈区:栈区的内存由编译器自动进行分配和回收;栈区存储函数的参数及局部变量会随着函数的创建而创建,函数的返回而销毁堆区:程序在运行期间可以主动从堆区申请内存空间,这些内存由内存分配器进行分配,由垃圾回收器进行回收二、分段栈和连续栈分段栈:Go1.3版本之前,随着 goroutine 调用的函数层级的深入或者局部变量需要的越来越多时,运行时会调用 runtime.morestack 和 runtime.newsta
2021-09-06 17:17:18 918
原创 Golang_内存管理
1. 内存池思想从操作系统申请一大块内存,以减少系统调用将申请到的大块内存按照特定大小预先切分成小块,构成链表为对象分配内存时,只需从大小合适的链表提取一小块回收对象内存时,将该小块内存重新归还到原链表,以便复用如闲置内存过多,则尝试归还部分内存给操作系统,降低整体开销2.内存管理三大组件mcache:本地缓存,绑定在每个 P 上,mcache 中持有一系列的 mspan(8 字节~ 32 KB大概 70 个种类)mcentral:全局中心被所有的工作线程共享,故获取资源的时候加
2021-09-06 16:55:06 235
原创 MySQL
1. 基础的分层第一层:客户端的连接处理、权限认证第二层:查询缓存、解析器(语法分析、关键字校验、语法校验等)、优化器(SQL优化、索引选择)、最终生成执行计划第三层:执行引擎(通过调用存储引擎查询数据的API获取数据)、存储引擎2. 存储引擎3. 索引4. 事务5. 日志6. 索引优化...
2021-08-25 11:21:35 154
原创 MySQL-事务
1.什么是事务事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句无法执行,那么所有的语句都不会执行。事务内的语句,要么全部执行成功或全部失败。2.事务的ACIDAtomicity(原子性)一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。Consistency(
2021-01-25 16:50:32 147
原创 Go之gorountine
1. 什么是协程协程(Goroutine)可以理解成轻量级的线程,与线程相比开销非常小。Go 应用程序通常能并发地运行成千上万的协程。 Go创建一个协程只要在方法或函数调用之前加上关键字 go 。2.创建单个协程package mainimport ( "fmt" "time")func helloWorld() { fmt.Println("Hello World!") fmt.Println("Hello World goroutine!")}func main() {
2021-01-08 17:42:06 285
原创 Git追加记录至上一次提交
一:场景:commit一次,同时已经push,需要增加一次commit到上一次commit1.提交需要增加的commit记录,追加至上一次 git commit --amend -m "注释"2.强制覆盖推送到远程分支 git push origin develop --force二:场景:commit一次,但是为推到远程分支,需要增加一次commit到上一次commit1.提交需要增加的commit记录,追加至上一次git commit --amend -m "注释"2
2020-12-15 15:36:25 2312
原创 MySQL-索引
什么是索引?索引是一种特殊的数据结构(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。注:一般数据库默认都会为主键生成索引索引的分类索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,即数据和机构存在一起;而非聚簇索引就不一样了,他的数据和结构是分离...
2020-10-17 23:52:04 163
原创 设计模式_简单工厂模式
工厂模式工厂模式的设计思想:工厂模式为了使得程序结构清晰、更好的管理,降低各个模块或者是各个类之间的的联系,方便维护,提高了生产效率!工厂模式的应用场景:工厂模式的分类:简单工厂模式:一个工厂生产所有产品工厂方法模式:一个工厂生产一个产品抽象工厂模式:一个工厂生产一组产品简单工厂模式简单工厂的实质是由一个工厂类根据传入的参数,动态决定应该创建哪种产品;例如:美的公...
2020-10-17 23:34:06 131
原创 Go之接口
1. 什么是接口?接口是一种抽象的数据类型,定义了对象的行为规范,但是不实现,由具体的对象实现规范细节。type 接口类型名 inferface{ 方法名a(参数列表a) 返回值列表a 方法名b(参数列表b) 返回值列表b ...}...
2020-08-13 19:01:19 264
原创 Go之type
type用于类型定义和类型别名类型定义: type 类型名 Type类型别名: type 类型名 = Type注意事项:type不能定义非本地类型的方法package mainimport "fmt"type myint inttype mystr stringfunc main(){ var i1 myint //定义新类型 var i2 int = 100 //类型别名 fmt.Println(i1, i2) fmt.Printf("%T\n%T",i.
2020-08-13 17:27:13 400
原创 Go之方法
1. 什么是方法方法就是一类带特殊的 接收者 参数的函数,即带了接收者的函数。方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。具体实例如下:package mainimport ( "fmt" "math")type Vertex struct { X, Y float64}//v为方法的接受者,Abs为方法名,float64为方法的返回值func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X
2020-06-29 15:11:01 154
原创 Go之包
1. 包的定义包是多个Go源码的集合,是一种高级的代码复用方案,例如fmt、time等#package bagname注意事项:包名为main的包为函数的入口包,这种包编译之后会得到一个可执行文件。包名可以和文件夹的名字不同,包名中不能含有“-”符号一个package的文件不能在多个文件下,一个文件夹下的文件只能归属一个包。2. 包的可见性#package pkg1import "fmt"var ma = 100 //ma首字母小写,故ma只限于本包访问 const
2020-06-23 17:53:37 158
原创 Go之结构体
1.自定义类型在Go语言中有一些基本的数据类型。如string、int、bool、float等,Go语言中使用type关键字进行自定义类型。//类型定义,将newInt定义为int类型type newInt int2.类型别名类型别名规定:myInt只是int的别名,本质上myInt与int是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。//类型别名type myInt = int3.类型别名与类型定义的区别pac
2020-05-30 20:18:06 232
原创 Go之map
1. map的概念map是一个无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化.map是Go语言中提供映射关系容器,其内部使用散列表(Hash)实现。2. map的定义map[KeyType]ValueTypeKeyType:表示键的类型ValueType:表示键对应的值得类型package mainimport "fmt"func main(){ //make(map[string]int,cap),使用make函数创建map,cap表示map
2020-05-18 22:24:23 310
原创 Go之切片
1. 切片的概念切片(Slice)是一个拥有相同类型元素的可变长度的序列。它的本质是对数组的封装。它支持自动扩容。切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。2. 切片的定义//声明切片的基本语法如下:var name []T //name表示变量名,T表示切片中元素的类型package mainimport "fmt"fu...
2020-05-05 02:11:34 230
原创 Go之数组
1. 数组的概念数组是同一种数据类型元素的集合。 在Go语言中,声明的时确定数组,使用的时候可以修改数组中的成员,但其大小不可变化。//基本语法//定义一个长度为10的整型数组,数组名为arrayvar array[10] int2. 数组的定义var 数组名[数组长度] 数组类型数组长度必须是常量,一旦定义,长度不能变,数组可以通过下标访问,下标是从0开始,最后一个元素...
2020-05-04 23:21:10 286
原创 Go之流程控制
1. if else//基本语法if 表达式1{ 分支1} else if 表达式2{ 分支2}else{ 分支3}Go语言规定,if 匹配的左括号必须与 if 表达式放在同一行,同理,与 else 匹配的 左括号("{") 也必须与 else写在同一行,else 也必须与上一个 if 或else if 右边的大括号在同一行。//示例代码:if score >= ...
2020-04-27 14:57:14 146
原创 Go之运算符
1. 算数运算符运算符描述+相加-相减*相乘/相除%取余注意事项:自增(++)和自减(–)是表达式,不是运算符2. 关系运算符运算符描述==判断两个值是否相等,若相等则返回 True否则返回False!=判断两个值是否不相等,若不相等则返回 True否则返回False>判断左边值是否大...
2020-04-27 13:50:21 249
原创 Go之数据类型
Go语言中有很多数据类型,除了基本的整型、字符型、布尔型外,还有数组、切片、结构体、函数、map、通道等。基本数据类型类型描述范围uint8无符号整型(8位)0~255uint16无符号整型(16位)0~655535uint32无符号整型(32位)Column 1Column 2centered 文本居中right-al...
2020-04-21 19:25:25 152
原创 算法-选择排序
选择排序的思路如下:从第二个数字开始,依次与第 i 位置数字进行比较,若比其小,则对俩俩交换,若比起大,则继续向后移动,一趟完成之后,最小的数字就找到了,然后 i++ ,然后重复刚才的操作,最终数列有序。实例代码如下://选择排序,时间复杂度:O(n*n),空间复杂度:O(1),不稳定void Select_Sort(int* arr, int len){ int i; int j;...
2019-10-12 22:48:00 105
原创 算法-Shell排序
Shell排序是对插入排序的改进和插入排序十分相似,Shell排序的思路如下:分组对每组进行排序:这个不是每组内有序,假设分为三组,使得这三组中的第一个数字有序,然后使得第二数字有序,一次所有数字都有序了最后归到一组示例代码如下:static void Shell(int* arr, int len, int grap){ int i; int j; int tmp; fo...
2019-10-12 22:36:52 120
原创 算法-二分排序
二分排序这个词是我在面试中遇到的,当时第一反应是二分查找,然后被打断,是二分排序算法,最终才了解到,二分排序就是我们熟知的归并排序。它又称二路排序。首先说一下归并的思想:先将一组数列,数列中含有n个元素,假设将每一个元素看成是一个有序的数列,就是n个有序的子序列,每个子序列的长度为1,然后俩俩合并,此时,有n / 2个长度为2的有序子序列,依次下去,最终整个数列有序。代码示例如下:...
2019-10-09 19:46:37 1596
原创 剑指offer_合并俩个有序数组
题目:给定俩个有序的数组,将俩个数组合并到一个数组中,使得数组依然有序。解题思路:用 i 和 j 标记俩个数组的开始位置,俩俩比较,将小的数插入到新数组中。当一个数组结束的时候,将另外一个数组插入到新数组中。示例代码如下:#include<iostream>#include<vector>using namespace std;void MergeOrde...
2019-09-28 23:27:34 178
原创 剑指offer_链表中找环问题
题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解题思路:定义俩个快慢指针,同时指向链表的头指针,快指针每次走俩步,慢指针每次走一步,当快慢指针相遇的时候,此时证明链表中有环,然后将快指针指向头指针,然后快指针和慢指针同时走,每次走一步,当快慢指正再次相遇的时候,此时这个结点就是环的入口结点。代码示例如下:/*struct ListNode { ...
2019-09-22 22:33:43 122
原创 剑指offer_将偶数置于奇数的前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路:重新创建一个新数组,然后顺序遍历原数组,找出其中的奇数,然后将其尾插到新数组,然后再次顺序遍历原数组,找出其中的偶数,然后再顺序尾插到新数组,最后将新数组赋给原数组。代码示例如下:class Solutio...
2019-09-22 21:41:43 120
原创 剑指offer_二叉树的层次遍历
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路:创建一个队列,先将二叉树的根节点放入队列中,然后开始循环,只要队列不为空,获取队列的第一个元素,将其保存为一个节点tmp,,接着将其push_back到新数组里面,然后判断其左孩子是否为空,若其不为空,将其push到队列中,然后再继续判断其右孩子是否为空,若不为空,将其push到队列中,然后将tmp结点pop.依次循环就完成...
2019-09-22 15:44:46 103
原创 Linux网路_TCP和UDP
一、TCP连接和断开连接的过程1.连接过程:(1)第一次握手:客户端向服务器端发送请求连接报文SYN,然后进入SYN_SENT状态,即已发送状态。(2)第二次握手:服务器端收到客户端发的SYN报文后,发送ACK进行确认,并发送自己的请求连接报文SYN报文,此时服务器端进入SYN_RECV状态,即已接受状态。(3)第三次握手:客户端收到服务器端的ACK和SYN后,此时客户端进入EStab...
2019-09-15 01:07:02 178
原创 C_数组越界
关于数组越界的理解代码如下:#include &lt;stdio.h&gt;int main(){int arr[10];for(int i = 0;i&lt;10;i++){arr[i]=0;}return 0;}i代表循环值,栈底的一格储存i,arr代表数组,除了底部的的一格,其余的格子代表储存数组的十个格子,中间有省略的格子,按照程序执行,i从0依次到9,然后在加一...
2019-09-14 22:41:33 553
原创 Linux_进程间通讯方式
管道有名管道:在磁盘上有一个文件标识,创建管道文件,但是交互的数据并不会存储到磁盘中,管道文件不会占据磁盘空间。有名管道没有在磁盘上存真正的信息,而是在内存中存放,2个进程结束后自动丢失,通信结束后有名管道的文件路径本身存在,这是和无名管道区别的地方。无名管道:首先创建一个管道文件,无名管道是一种特殊类型的文件,在内核空间中对应的资源即是一段内存空间,内核在这段空间以循环对列的方式临时存入...
2019-09-14 21:35:16 192
原创 C++_设计模式之单例模式
单例模式单例模式的定义: 说起单例模式,根据字面意思理解,就是只生成一个对象!并提供一个公有的接口,供其他对象共享!这也是单例模式的主要思想!单例模式的种类:普通的懒汉模式(线程不安全)安全的懒汉模式(线程安全,双重加锁)饿汉模式(线程安全)单例模式的要点:确保一个类中只有一个对象生成提供对象的全局访问指针由编码者实现唯一对象的实例化单例模式的应用场景:...
2019-09-07 12:30:30 144
原创 算法-堆排序
堆排序基本思路:首先建大根堆,然后进行堆调整,最后顺序打印出来就是有序的啦!建大根堆,建一颗二叉树,使得左右孩子的值都大于父节点,从最后一个父节点开始,循环调整使得满足父节点大于左右孩子的值,如下图:代码示例如下:void build_max_heap(int tree[], int len) //建大根堆{ int last_index = len - 1; ...
2019-08-30 13:37:59 127
原创 C++_智能指针
智能指针的设计思想我们一般通过在栈上创建一块内存管理堆上开辟的内存,根据堆栈的特点,我们可以知道,栈上的内存一般是由系统负责回收的!而堆上的内存则需要我们自己进行释放,忘记释放就会早成内存泄漏,因此,智能指针的设计思想就是为了满足内存由程序员开辟,然后由系统自动释放。智能指针之auto_ptr这是一个所有权唯一的智能指针,其特点是管理权唯一,释放权唯一,当俩个指针指向同一块内存的时候,...
2019-08-29 01:41:32 314 1
原创 剑指offer_从尾到头打印链表
解法一:通过栈先进后出的特点,先将链表每个结点压到栈里面,最后出栈就可以实现了从尾到头打印链表。代码实现如下:struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL) {}};class Solution {public: vec...
2019-08-23 00:07:29 110
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人