- 博客(262)
- 资源 (8)
- 收藏
- 关注
原创 go中channel缓冲和非缓冲区别
分析下面一道题目,再次感受channel的缓冲和非缓冲的区别// 错误写法func (set *threadSafeSet) Iter() <-chan interface{} { ch := make(chan interface{}) go func() { set.RLock() for elem := range set.s { ch <- elem ...
2019-04-15 00:09:18
535
原创 对go中defer机制的理解
看下面一道题。package mainimport "fmt"func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret}func main() { a := 3 b := 2 defer calc...
2019-04-14 23:52:28
513
原创 为什么会出现hash哈希散列
如何理解hash(又名哈希,或者散列)实现hash的数据结构示意图由图可知,哈希表其实就是一个一维数组,而数组中的每一个元素都是一个单向链表而已。这样的数据结构解决了数组的增删元素的不足和链表的查询效率的不足。哈希原理通过哈希算法(md4 md5 sha1 …)将任意长度的数据映射成固定长度,较少位数的二进制数据。以映射后的二进制数据为依据进行存储,构造成哈希表。在后续查找时,也是根据原...
2019-04-13 14:01:46
543
原创 c++ stl中的set
有关stl中的set,平时关注和使用的最少,往往会忘记他的特性。总结如下:跟vector和list相比,set中存储的数据天然有序;跟map相比,set中只存储key,没有value。set的声明如下template <typename T> set<T>;...
2019-04-13 13:20:11
178
原创 epoll模型水平触发、边沿触发优缺点对比
epoll模式下的水平触发、边沿触发1,epoll默认是水平触发2,水平触发通俗来讲:只要有数据,epoll_wait函数就一直返回;边沿触发通俗来讲:只有socket状态发生变化,epoll_wait函数才会返回。3,水平触发优、缺点及应用场景:优点:当进行socket通信的时候,保证了数据的完整输出,进行IO操作的时候,如果还有数据,就会一直的通知你。缺点:由于只要还有数据...
2019-04-12 10:36:12
6391
1
原创 为什么会出现websocket
为什么会出现websocket?websocket解决了http存在的什么问题?http有一些问题,为了解决这些问题,websocket出现了:1,请求/响应是单向的,只能客户端主动发送请求,服务端被动的通过响应将消息回复给客户端;2,为了实现即时通信,采用的技术都是“轮询”,即在特定的时间间隔内,由浏览器对服务器发出HTTP Request,服务器在收到请求后,返回最新的数据给浏览器...
2019-04-11 22:51:35
478
原创 ssh sshd 区别
ssh sshd 区别:ssh是英文secure shell的简称,通过ssh机制可以实现在两台Linux主机之间建立可靠的shell连接。ssh运行在客户端,sshd运行在服务端,服务端通过sshd开启shell窗口,完成连接。并且可以通过修改sshd的配置文件,实现黑白名单、登录画面等功能。...
2019-04-11 14:00:18
9538
原创 如何理解go中的interface接口
对于go语言中interface接口的理解,有一个疑问:既然接口只保存了函数,那么他到底有没有操作实际对象呢?如果操作的话,是怎么操作实际对象的?答案:是。怎么操作的,请看一层一层的解释。1,假设有一个结构体,通过绑定method的形式,实现了一个接口所需要的所有方法。那么它就可以理解为一个接口的实现。本身结构体中除了method以外,还有别的字段,那么就可以通过method修改字段的值,...
2019-04-10 16:39:04
248
原创 go中的面向对象
在开发go的时候,不免与c++进行对比,发现确实有先进之处。就拿面向对象来举例吧。go中通过struct关键字实现类似于c++中的类这个概念。通过在struct中添加匿名字段的方式,来实现类似于c++中的继承。通过在struct对象,或者struct指针对象上绑定函数,此时的函数在go中称作method,来实现c++中类的成员方法。总结就是,c++中的成员变量通过struct内的字段来实现,c...
2019-04-10 15:05:06
279
原创 go在实现对象和指针上同时调用method的闪光点
对于go语言而言,通过对象和指针这两种方式调用method都可以,因为Go知道receiver是指针,他自动帮你转了。也就是说:如果一个method的receiver是*T,你可以在一个T类型的实例变量V上面调用这个method,而不需要&V去调用这个method类似的如果一个method的receiver是T,你可以在一个*T类型的变量P上面调用这个method,而...
2019-04-09 23:40:57
274
原创 go语言如何编译成库
将go语言编译成自己想要的库,需要经历下面几个步骤:1,代码首行package的名字就是所期望的库的名字2,代码所在文件夹的名字和package名字必须保持一致3,在文件夹下运行go install命令,完成库的编译和安装4,安装之后的目录是GOPATH/pkg + 源码所在文件夹相对于GOPATH/src的路径...
2019-04-08 22:46:55
2922
原创 go中如何实现继承
go中面向对象归纳为2方面,结构体struct和接口interface。对于结构体struct,通过匿名成员的方式实现继承,比如,Student继承了Mentype Men struct { name string age int}type Student struct { Men score int}对于接口interface,通过直接引入另...
2019-04-04 15:54:00
1608
原创 几种树的优缺点和应用场景
二叉树:解决的是线性表插入慢,链表查找慢的问题,是一种这样的方法。时间复杂度介于对数级和线性级之间。当是完全的平衡二叉树时,时间复杂度是对数级,当时完全的不平衡二叉树时,即已经退化为链表,是线性级。单纯的二叉树只是一个概念,并没有实际应用场景。二叉查找树:又名二叉排序树,二叉搜索树。如果存在左子树,那么左子树上所有节点均小于根节点,如果存在右子树,那么右子树上所有节点均大于根节点。并且,...
2019-03-27 15:01:50
3232
原创 go语言如何引用别的文件的内容
go不同文件之间的相互引用靠包来实现,总结下来就是:1,文件夹就是包,文件夹名就是包名2,同一文件夹(包)下的所有文件可以视为同一文件,也就是可以随意拆分或者合并为一个或多个 go 文件都没有影响,文件名对程序也没有影响3,同一文件夹(包)下的所有文件, package name 必须一致。4,如果要使用其他文件夹(包)下的资源,使用 import 导包, import 导包的路径...
2019-03-27 00:04:08
20765
2
原创 树的高度、深度、层数
可能是全网最透彻的讲解树的基本概念的一篇文章了。对于很多朋友来说,特别是半路出家转码农的朋友来说,数据结构是最薄弱的一项了,线性表和链表还好理解(如果链表不懂的见我的另一篇文章https://blog.csdn.net/jigetage/article/details/88694867),一到树就完全懵逼了,甚至看不懂别的网友发的博客。大部分原因是不知道有关树的基本概念。这里总结出来,熟练背诵...
2019-03-26 16:31:28
7147
2
原创 同步、异步、阻塞、非阻塞的区别
这可能是全网把同步/异步、阻塞/非阻塞区别分析的最到位的一篇文章了。朋友,如果你看完了,并且也觉得可以,请赏赐本屌一个赞吧!~比心~同步/异步、阻塞/非阻塞是针对不同的场景来说的。同步/异步:针对的是调用过程,对象是两个进程。进程1调用了进程2,进程2接收了这个调用,然后开始处理。如果是同步调用,那么在进程2处理完之前,进程2不能干别的事情了,得一直处理这个调用过程。如果是异步调用,那...
2019-03-25 14:44:19
446
原创 io复用相对于多进程、多线程的优势
网络编程中,实现并发的方法一般都是多线程、多进程、io复用技术。当被问到io复用技术相对于多线程、多进程的优势时,可以这样回答:cpu的最佳理想工作状态时:当需要的时候立即被调度到,当不需要的时候就好像没有一样。对于多进程、多线程方式,不论有无实际消息进来,线程/进程都可能被分配cpu的时间片,如果被cpu调度的时候,正好没有消息进来,那么就会造成cpu空调度,浪费资源。而对于io复用技术...
2019-03-25 14:21:27
1114
原创 最容易理解的tcp校验和
什么是tcp校验和?tcp报文中,在tcp的首部之前,多了一个12字节的伪首部,伪首部中4个字节保存源ip信息,4个字节目的ip信息,一个字节的保留位置,一个字节保存协议号(6代表tcp,17代表udp),2个字节保存tcp的真正首部和数据。根据伪首部的信息通过位运算,得到了一个校验和数据,保存在tcp保温的checksum字段。接收端接收到tcp报文后,也按照特定算法计算出一个校验和...
2019-03-22 13:59:52
5267
原创 c++ 模板template中的class和typename区别
在实际使用中注意以下两点即可。1,在类外或者方法外添加模板声明时,二者无区别。2,当template<typename T>或者template<class T>中的T是一个类类型,而且这个类又有子类(假设名为 innerClass) 时,应该用 typename T::innerClass 的方式来声明innerClass变量,比如:typename T::...
2019-03-22 09:38:27
3269
原创 为什么链表特别难以理解
为什么对于某些同学来说,链表特别难以理解?大概率的原因是没有分清楚节点和指向节点的指针这两个概念。节点:固定的,是一块内存区域,存储节点的信息。指向节点的指针:自由的,可以随意更改。下面通过两个典型代码进行详细分析。pNode1 = pNode2; // 这行代码的意思是:将pNode1 指针指向pNode2指针所指向的节点,造成一个节点被两个指针指向pNode1-...
2019-03-20 17:42:09
2347
原创 单链表中的环面试题目
对于链表中的环,常见面试题目有下面几个:1.给一个单链表,判断其中是否有环的存在?思路:采用快慢指针,快指针每次走2,慢指针每次走1,如果在快指针遍历链表结束之前,二者相遇,则说明有环。2.如果存在环,找出环的入口点?思路:从链表起点到环的入口点,与从快慢指针相遇点到环的入口点,距离相同。3.如果存在环,求出环上节点的个数?思路:1,采用已经进入环中慢指针遍历环,当再次到达...
2019-03-20 17:22:27
341
原创 对链表翻转/逆置的一些理解
// 写在前面,首先是要区分节点和指向节点的指针,链表在内存中是以节点的形式存在的,节点指针只是为了方// 便写程序的时候操作,而认为创造出来的。node* rev(node *head) {node *prev=NULL,*next=NULL; while(head){next=head->next; // 将next指针指向头结点的下一个节点head->next=p...
2019-03-20 16:35:03
205
原创 QString和std::string转换乱码的解决方法
std::string cstring;QString qstring;//从std::string 到QStringqstring = QString(QString::fromLocal8Bit(cstring.c_str()));//从QString 到 std::stringcstring = std::string((const char *)qstring.toLocal8...
2019-03-19 18:23:02
6362
4
原创 ZeroMQ教程入门学习攻略
本人在zeromq使用过程中主要参考了如下博客。1,概要和快速入门https://www.cnblogs.com/chenny7/p/6245236.html2,使用举例https://blog.csdn.net/brimsullowr/article/details/827704443,架构分析https://www.cnblogs.com/rainbowzc/p/335...
2019-03-15 18:00:30
6672
原创 mac下通过homebrew安装mysql5.7后运行mysql_secure_installation时失败,提示需要输入默认密码,保存默认密码的文件路径找不到
mysql5.7以后mysql太坑了,为了安全机制,会生成一个默认的root密码,在安装完毕后,运行mysql_secure_installation时,需要输入默认密码。但是,你找遍了整个mac,也找不到保存这个密码的文件放在了哪里。如果通过下载dmg安装包的形式,则不会碰到这个问题,因为安装包上会明确的写出密码。那么,如果碰到了这个问题怎么办呢?一般思路就是找密码,但是你会发现,找遍这...
2019-03-15 00:25:28
3670
原创 mac下vscode安装go扩展失败的解决方法
网上搜索了很多方法来解决安装go扩展失败的问题,很多回答都比较乱,自己按照下面的步骤解决了问题。// 路径下创建此文件mkdir -p $GOPATH/src/golang.org/x// 切换到此目录cd $GOPATH/src/golang.org/x// 通过git安装 toolsgit clone https://github.com/golang/tools....
2019-03-10 22:56:40
3215
4
原创 如何理解go语言中的闭包
对于闭包的理解,按照下面2点切入即可:1,闭包函数的返回值是函数2,返回的函数绑定在闭包函数内一个变量上。对于第2条如果不好理解的话,可以这么理解。把外层的函数去掉,把函数内定义的变量想象成全局变量,把返回的函数想象成普通函数。本质上,就是返回了一个函数,这个函数内操作的变量是在另一个函数中定义的,而且是以引用的形式被调用。一个闭包只有没有外界引用时,才会连同状态一起被销毁。典...
2019-03-07 16:07:50
1019
原创 vtk中如何添加qt支持
在vtk中添加qt支持,其实就是在编译vtk的时候,打开qt的编译选项。主要分为三步。第一步:在系统环境变量中添加qt安装路径,比如第一步:修改vtk源代码最上级的cmakelists.txt文件,加上 set(CMAKE_PREFIX_PATH $ENV{QT_PATH})第三部:在cmake gui客户端或者命令行添加与qt相关的编译选项,包括: -DModule_v...
2019-03-04 15:54:09
2308
原创 windows .bat脚本如何添加换行符
当一条命令需要设置的参数过多时,如何写在同一行,会造成一行特别特别长,很影响阅读和修改,可以考虑使用换行符。在.bat脚本文件中,换行符是"^",即shift + 6。...
2019-03-04 15:49:04
37476
1
原创 cmake add_subdirectory如何添加根目录之外的文件目录
// 假设add_subdirectory需要添加的目录,是当前cmakelist.txt文件所在目录的同级目录的子目录if(NOT NEED_DIR) set( NEED_DIR ${CMAKE_SOURCE_DIR}/../PEER_DIR)endif()if( IS_DIRECTORY ${NEED_DIR} ) add_subdirectory( ${NEE...
2019-02-27 13:34:45
8136
2
原创 对waitforsingleobject的理解
当调用waitforsingleobject被阻塞时,说明在调用的时候所监视的内核对象是non-signaled状态。然后,开始阻塞等待,突然,发生了某种情况,导致监视的内核对象变成了signaled状态,这时waitforsingleobject函数解除阻塞,开始运行,运行完了,函数返回。在返回后,如果所监视的内核对象是自动置位的,那么内核对象变为non-signaled状态,否则继续保持sig...
2019-02-20 23:25:14
757
原创 如何在vscode中添加c++包含目录
visual studio中如何添加,cmake中如何添加,已经是老生常谈了,但是vscode中如何添加还是很新鲜。方法:在c_cpp_properties.json中的includePath字段中添加包含路径即可。windows下,c_cpp_properties.json文件默认位于c:\.vscode\c_cpp_properties.json...
2019-02-16 17:01:18
16246
原创 Linux/Mac zsh/bash下系统命令配置文件
linux:针对所有用户:/etc/profile针对当前用户:$HOME/.profile 或者 ~/.profilemac:针对所有用户:/etc/profile针对当前用户: bash:$HOME/.bash_profile 或者 ~/.bash_profile zsh:$HOME/.zshrc或者 ~/.zshrc强制自动生效:...
2019-02-14 10:53:05
1096
原创 递归锁 非递归锁
一、先上结论:递归锁:同一个线程在不解锁的情况下,可以多次获取锁定同一个递归锁,而且不会产生死锁;非递归锁:在不解锁的情况下,当同一个线程多次获取同一个递归锁时,会产生死锁。二、典型应用:windows下的互斥量和临界区(关键段)是递归锁;linux下的互斥量pthread_mutex_t是非递归锁,但是可以通过在创建互斥量时设置PTHREAD_MUTEX_RECURSIVE属...
2019-02-13 10:40:01
6773
原创 通过引用计数实现智能指针
通过模板和引用计数的方式实现智能指针,需要两个类:智能指针类SmartPtr,和智能指针辅助类SmartPtrHelper,其中用户接触到是SmartPtr类,而SmartPtr类通过SmartPtrHelper管理指针的内存和计数。具体实现如下:SmartPtrHelper类//模板类作为友元时要先有声明template <typename T>class SmartP...
2019-02-12 13:58:57
328
原创 VSCode常用快捷键总结,不断更新中。。。
1,格式化代码on windows: shift + alt + fon mac: shift + option + fon ubuntu: ctrl + shift + i2,选中一行on windows: ctrl + ion mac: cmd + i3,删除整行on windows: ctrl + shift + kon mac: cmd + shift ...
2019-02-12 13:43:53
294
原创 读写锁是什么
前言:对于非计算机专业出身的朋友来说,很少会接触到读写锁这个高级概念,一般都只是使用到互斥量这一层。那么为什么有了互斥量(互斥锁)之后,还要发明读写锁呢?结论:读写锁是效率更高的互斥量(在大多数条件下)。理由:读写锁分为三种状态1,以读的方式占据锁的状态。此时,如果有另外线程请求以读的方式占据锁,那么不会阻塞,可以再次占据。如果有另外线程请求以写的方式占据锁,那么会阻塞,直...
2019-02-12 11:11:16
1656
原创 条件变量和互斥量的关系
一,先上结论:通过条件变量实现的阻塞,本质上依靠的是与条件变量相关联的互斥量,条件的检测是在互斥量的保护下进行的。当条件变量处于未触发的状态时,线程自动阻塞,并释放与条件变量相关联的互斥量。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,被唤醒的线程重新获得互斥锁,重新评价条件。二,详细解释1,初始化#include <pthread.h&g...
2019-02-11 17:57:34
1272
1
谷歌Google C++ 代码规范
2017-09-09
spawn-fcgi-1.6.4.tar.gz
2018-12-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅