自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 问答 (3)
  • 收藏
  • 关注

原创 openssl

CA(Certificate Authority):颁发数字证书的机构,作为受信任的第三方,承担公钥体系中公钥的合法性校验的责任。CA为每个使用公钥的用户颁发一个数字证书,并且对该证书进行签名。CA自己也拥有一个证书(含公钥),任何人都能得到CA的证书,用来验证CA所签发的证书。数字签名:用私钥对某个文件/某段消息的散列值进行加密。验证数据的完整性和是否被篡改。在通信中,双方每次在写完消息之后,计算消息的散列值,并用自己的私钥加密生成数字签名,附在信件后面 ,接收者在收到消息和数字签名之后,先计算散列

2020-07-01 18:50:15 231

原创 grpc和go module

RPC就是要像调用本地的函数一样去调远程函数。但是在调用远程函数的时候会出现一些问题:Call ID映射。在本地调用中,函数体是直接通过函数指针来指定的,我们调用函数时,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <–> Call ID}

2020-06-30 13:13:50 404

原创 Channel

goroutine之间的通信使用channel。数据传送是阻塞式的,发了数据之后必须有人来收数据。func chanDemo() { //var c chan int // c == nil c := make(chan int) go func() { //这里的匿名函数相当于闭包,引用了外面的c变量 for { n := <-c //开了一个goroutine去接数据 fmt.Println(n) } }() c <- 1 //往channel中发生数据

2020-06-28 17:07:26 4552

原创 goroutine

goroutinefunc main() { for i := 0; i < 1000; i++ { go func(i int) { for { fmt.Printf("Hello from "+"goroutine %d\n", i) } }(i) } time.Sleep(time.Millisecond)}goroutine其实是一种协程coroutine。协程是轻量级的“线程”,线程是由OS进行调度的,因此在任何时候都可以被抢占的,而协程是非抢占

2020-06-11 14:58:45 224

原创 测试与性能调优

测试go语言测试文件命名:name_test.go,编译器就是识别这个测试文件。go test . 执行当前目录下的测试文件。func TestSubStr(t *testing.T) { //表格驱动测试 tests := []struct { s string ans int }{ //Normal cases {"abcabcabc", 3}, {"pwwkew", 3}, //Edge cases {"", 0}, {"abcabcabcd", 4}

2020-06-09 18:29:56 220

原创 错误处理

defer的调用确保调用在函数结束的时候发生参数在defer语句时计算defer列表为后进先出func writeFile(filename string) { file, err := os.Create(filename) if err != nil { panic(err) } defer file.Close() //确保在函数结束的时候关闭文件 //直接用file写比较慢,使用bufio,先写到内存里,当内容大到一定的程度之后,再写到文件中 writer := bufio.

2020-06-07 17:03:16 219

原创 函数式编程

函数与闭包函数是一等公民:参数、变量、返回值都可以是函数,函数也可以实现接口。在C++中就只有函数指针。“正统”的函数式编程:不能有状态,只能有函数和常量;每个函数只能有一个参数。go语言没有Lambda表达式,但是支持匿名函数。一个持有外部自由变量的函数就是闭包。要搞清楚闭包的关键,就是要分析出返回的函数它使用(引用)到哪些变量,因为函数和它引用到的变量共同构成闭包。func adder() func(int) int { sum := 0 //自由变量 return func(v int

2020-06-06 16:57:17 123

原创 面向接口

duck typing的概念描述事物的外部行为而非内部结构。在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型,而不在于它是否显示的实现或者继承。动态类型语言:是在运行时确定数据类型的语言,变量在使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。如Python静态类型语言:在编译时变量的数据类型就可以确定的语言。如C++像C++一类的静态类型语言,传入的参数必须要是所要求的类型才行,要想表现出不同的行为,就得通过继承、多态等机制。

2020-06-06 15:16:34 201

原创 面向对象

结构体和方法go语言仅支持封装,不支持多态和继承,使用接口来实现。因此只有struct,没有class。一律使用点来访问成员。type treeNode struct { value int left, right *treeNode}func main() { var root treeNode //go语言提供了非常多的构造方法,因此没有构造函数的说法 root = treeNode{value:3} root.left = &treeNode{} root.righ

2020-06-05 17:20:52 130

原创 内建容器

数组定义数组 var arr1 [5]int arr2 := [3]int{1,3,5} arr3 := [...]int{2,4,6,8} //使用编译器来推断数组中的元素[...],如果不写...就是切片 fmt.Println(arr1, arr2, arr3) var grid [4][5]int fmt.Println(grid)遍历数组for i := 0; i < len(arr3); i++{ fmt.Println(arr3[i]) } for i, v

2020-06-05 13:51:50 158

原创 go语言基础

变量定义//在函数外面不能使用 : 来定义变量//使用var()实现集中定义var ( aa = 3 // 作用域 包内部 ss = "kkk" bb = true)func variableZeroValue() { var a int // 默认值为0 var s string //变量的类型在后,定义了变量之后,之后必须使用到。默认初值为0 fmt.Printf("%d %q", a, s) fmt.Println()}func variableInitialV

2020-06-02 15:54:22 142

原创 LeetCode 289 生命游戏

题目描述方法一:使用额外数组这里主要的技巧就是如何找到一个点周围的八个点,使用了一个8行2列的数组。class Solution { int d[8][2] = {{0,-1},{-1,0},{0,1},{1,0},{-1,-1},{-1,1},{1,1},{1,-1}}; int m; int n; bool isArea(int x, int y){ ...

2020-04-02 11:22:45 106

原创 future其他成员函数、shared_future、atomic

一.future的其他成员函数wait_for()#include <bits/stdc++.h>#include <thread>#include <mutex>#include <condition_variable>#include <future>using namespace std;class A{ ...

2020-03-28 15:57:11 265

原创 LeetCode 42接雨水

方法一:暴力 —>超时class Solution { int findLeftMaxHeight(vector<int>& height, int center){ int res = 0; for(int i = center - 1; i >=0; i--){ res = max(res, ...

2020-03-25 12:04:07 72

原创 leetcode 892 三维形体的表面积

在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。请你返回最终形体的表面积。输入:[[1,0],[0,2]]输出:16每个正方体能够贡献6个单位面积,两个正方体重叠的话,会减少2个单位面积。两个正方体重叠,分成垂直重叠、行重叠、列重叠三种。表面积 = 正方体个数 * 6 ...

2020-03-25 10:14:43 131

原创 async、future、packaged_task、promise

一.async、future创建后台任务并返回值希望线程返回一个结果std::async是个函数模板,用来启动一个异步任务。什么叫“启动一个异步任务”,就是自动创建一个线程并开始执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象里面就含有线程函数返回的结果,我们可以通过调用std::future对象的成员函数get()来获取结果。当调用future对象...

2020-03-24 16:28:53 271 1

原创 条件变量

一.条件变量condition_variable、wait()、notify_one()condition_variable实际上是个类,是一个与条件相关的类,说白了就是等待一个条件的达成。这个类是需要和互斥量来配合工作的,用的时候我们要生成这个类的对象。实例代码:线程A:等待一个条件满足线程B:专门往消息队列扔消息(数据)wait():等一个条件的满足。如果第二个lambda表达式的返...

2020-03-23 18:15:54 395

原创 单例设计模式共享数据分析、解决

一.设计模式大概谈“设计模式”:代码的一些写法(这些写法跟常规写法不怎么一样):程序灵活,维护起来可能很方便,但是别人接管、阅读代码都会很痛苦。用“设计模式”理念写出的代码很晦涩的。《head first》讲设计模式,可以了解一下。老外为应付特别大的项目的时候,把项目的开发经验、模块划分经验,总结整理成设计模式(先有开发需求,后又理论总结和整理)设计模式拿到中国来,不太一样,拿着一个程序(...

2020-03-23 14:40:46 267

原创 unique_lock详解

一.unique_lock取代lock_guardunique_lock是个类模板,工作中,一般lock_guard(推荐使用);lock_guard取代了mutex的lock()和unlock();unique_lock比lock_guard灵活很多,效率上差一点,内存占用多一点。二.unique_lock的第二个参数1.adopt_lockadopt_lock其标志作用,表示这个互斥...

2020-03-23 13:06:57 2240 3

原创 互斥量概念、用法、死锁演示及解决详解

一.互斥量的概念保护共享数据,操作时,某个线程用代码把共享数据锁住、操作数据、解锁其他线程想操作共享数据必须等待解锁。互斥量:是个类对象,理解成一把锁,多个线程尝试用lock()来加锁,只有一个线程会加锁成功,成功的标志就是lock()返回,如果不成功,会一直阻塞在lock()处。互斥量使用要小心,保护数据不多也不能少,少了,没有达到保护的效果,多了,影响效率。二.互斥量的用法1.l...

2020-03-22 15:00:04 1011

原创 创建多个线程、数据共享问题

一.创建和等待多个线程多个线程执行的顺序是乱的,与操作系统内部对线程的调度机制有关。主线程会等待所有的线程运行结束,最后主线程结束。把thread对象放入容器里面管理,这对一次创建大量的线程并对线程进行管理很方便。#include <bits/stdc++.h>#include <thread>using namespace std;void myPri...

2020-03-22 13:26:31 194

原创 leetcode 945使数组唯一的最小增量

给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。返回使 A 中的每个值都是唯一的最少操作次数。输入:[3,2,1,2,1,7]输出:6解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。一定先看清题目,消除重复的方法只有递增。方法一:先进...

2020-03-22 12:13:31 164

原创 多线程传参

一.传递临时对象作为线程参数1.要避免的陷阱1)用detach()时,如果主线程先结束,变量就会被回收;所以用detach()的话,不推荐用引用,同时绝对不能用指针。#include <bits/stdc++.h>#include <thread>using namespace std;void myPrint(const int& i, char* p...

2020-03-21 17:26:02 553

原创 线程启动、结束、创建线程多个方法,join和detach

一.线程运行的开始和结束主线程从main()函数开始执行,因此我们自己创建的线程,也需要从一个函数函数开始运行(初始函数),一旦这个函数执行完毕,就代表我们的线程运行结束。整个进程是否执行完毕的标记:主线程是否执行完毕。一般情况下,如果主线程运行完毕,而子线程还没运行完成,则这些子线程就会被操作系统强行终止,因此如果想保持子线程的运行状态的话,就要让主线程一直保持运行。—>这个有例外,...

2020-03-21 15:11:52 869

原创 并发基本概念及实现,进程、线程基本概念

1.并发、进程、线程的基本概念并发:两个或者更多的任务同时的进行;在一个时刻可以同时执行多个独立的任务。对于单核CPU,某个时刻只能执行一个任务,由CPU进行调度,每秒进行多次所谓的任务切换,会造成并发的假象,每个任务在切换的时候,需要保存一定量的数据,以保证可以再次正确的执行到这个程序,称为上下文切换,这是有时间开销的。对于多核CPU,能够实现真正的并发,同一个时刻每一个CPU执行一个任务...

2020-03-21 13:05:51 307

转载 数据库事务与锁详解

数据库事务与锁详解

2020-03-19 20:35:57 129

原创 红黑树

2-3树:满足二分搜索树的基本性质,节点可以存放一个元素或者两个元素。即每个节点有2个或者3个孩子。2-3树是一颗绝对平衡的树,左右子树的高度一定是相等的。主要学习的几个树结构:二分搜索树(有可能退化成链表)、堆(完全二叉树)、线段树(数据分布在最后两层)、Trie、并查集、二叉平衡树(左右子树的高度差不能超过1)。2-3树插入如何维持绝对的平衡?添加节点,永远不会添加到空的位置,需要和我...

2020-03-19 16:57:42 454

原创 leetcode 647回文子串

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".判断是否是回文串,分成奇数和偶数两类,中心扩展。如果是奇数,中心字符是当前字符,向两边扩展。如果是偶数,中心字符是当前字符...

2020-03-19 12:40:25 66

原创 leetcode 409最长回文串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。示例 1:输入:"abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7回文串分成偶数的回文串和奇数的回文串,对于偶数的回文串,回文串的每个字符的数量都是偶数,对于奇数的回文串,除了中间的字符,其余字符的数量都是偶数。解法一:class Solutio...

2020-03-19 12:28:50 88

原创 数据库索引

创建索引的时机:数据量特别大该字段很小的修改操作在where里使用>,≥,=,<,≤,is null和between等字段组合索引中字段的顺序,选择性越高的字段排在最前面。经常用于连接查询的字段order by和group by字段不使用索引:数据量少数据重复且分布平均的字段(只有很少数据值的列)经常插入、删除、修改的表要减少索引MySQL能估计出全表扫描比使用索引更快...

2020-03-18 22:18:54 97

转载 为什么MySQL数据库InnoDB引擎采用B+树存储索引?

一个节点大小定为一页,一个节点需要一次I/O操作。B+树中内节点不含数据部分,其出度更大,每一个内节点可以存的关键值也就越多,即到达内存数据的更多,效果更好。B+树的叶子节点采用链表连接起来,适合查询一定范围内的数据。在InnoDB中使用自增主键,每次添加操作,只需要在最后直接插入就可以。B树和B+树的特点既然hash比B+树更快,为什么还用B+树来存索引?hash无法支持范围查找...

2020-03-18 21:55:51 158

转载 在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?

打开浏览器,输入zhihu.com敲回车键。浏览器对用户输入的网址做初步的格式化检查,一般浏览器都会有默认的搜索引擎,格式不正确的话就会直接使用这个搜索引擎进行搜索。若没有告知使用哪个协议,看浏览器默认使用什么协议,如http协议。浏览器补齐为:http://zhihu.com。DNS查询:先查自己内存里的DNS Cache,没有;再查本地硬盘的host文件,也没有;将请求发送给自己的DNS...

2020-03-18 21:26:07 351

转载 面试HTTP

1.HTTP的概念HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。2.HTTP常见的状态码200 OK 成功状态码,表示一切正常。如果是非HEAD请求,服务器返回的响应都会有body数据。301 Moved Permanently永久重定向,说明请求的资源已经不存在了,搜索引擎在抓取新内容的同时将旧的网址交换为重定向之后的网址。302 Fou...

2020-03-18 20:08:04 136

原创 leetcode 836矩阵重叠

给定两个矩阵的左下坐标和右上坐标,如何判断这两个矩阵是否重叠?解法一:矩形重叠的情况太多,难以处理,所以转而思考矩形不重叠的情况。考虑rec2在rec1的左边、右边、上边、下边左边:rec1[0] >= rec2[2]右边:rec1[2] <= rec2[0]上边:rec1[3] <= rec2[1]下边:rec1[1] >= rec2[3]class So...

2020-03-18 10:53:34 288

原创 leetcode 382 链表随机节点 蓄水池采样

如何从n个数中等概率的取出k个数?(n是不确定的或者确定的) 概率为k/n蓄水池抽样:先将前k个数取出来放入结果集中,然后从第k+1个数开始遍历。假设遍历到第i个数,以k/i的概率去第i个数去替换掉蓄水池中的某个元素。init: a reservior with size: k for i = k+1 to N: t = random(0,i); //[0,..i] if(t &lt...

2020-03-17 15:40:21 129

原创 leetcode 1160 拼写单词

给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写时,chars 中的每个字母都只能用一次。返回词汇表 words 中你掌握的所有单词的 长度之和。输入:words = ["cat","bt","hat","tree...

2020-03-17 13:50:16 99

转载 主定理求解递归式

1、主方法使用条件用主方法求解递归式有条件,必须要求递归式为以下形式:其中a>=1,b>1,f(n)渐进趋正,意为对足够大的n,f(n)是正的,即n>=n0n_0n0​ 时,f(n)>0。其中 n为问题规模, a为递推的子问题数量, n/b 为每个子问题的规模(假设每个子问题的规模基本一样), f(n)为递推以外进行的计算工作。2、主方法具体使用**核心是比...

2020-03-15 16:39:07 596

原创 leetcode 94二叉树的中序遍历

中序遍历:左–根--右利用栈struct Command{ public: string s;//"go" "print" TreeNode* node; Command(string s, TreeNode* node) : s(s), node(node){}};class Solution {public: vector<int>...

2020-03-15 15:14:16 87

原创 leetcode 300最长上升子序列

动态规划class Solution {public: int lengthOfLIS(vector<int>& nums) { int n = nums.size(); if(n == 0) return 0; vector<int> dp(n,0); int res = 0; ...

2020-03-14 16:01:19 81

原创 leetcode 只出现一次的数字

leetcode 136只出现一次的数字I给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。异或操作:交换律:a ^ b ^ c <=> a ^ c ^ b任何数于0异或为任何数 0 ^ n => n相同的数异或为0: n ^ n => 0class Solution {public: int ...

2020-03-13 12:56:27 116

空空如也

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

TA关注的人

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