自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Simon的博客

专注于互联网后台架构开发

  • 博客(17)
  • 收藏
  • 关注

原创 go语言函数传递问题(map、切片、接口、chan)

一句话总结:map、切片、接口、函数类型、chan都是引用类型,作为函数参数传递不会复制一个副本。package mainimport ( "fmt")func change(a int) { a = 10}func changeMap(m map[int]string) { _, ok := m[1] if ok { m[1] = "ja

2017-11-26 23:00:04 2449 2

原创 go语言中select与switch的区别

一句话总结:switch主要用于表达式的比较判断,select主要用于通信即IO。package mainimport ( "fmt")func main() { key := 10 switch key { case 7: fmt.Println("7") case 10: fmt.Println("10") default

2017-11-26 22:52:10 647

原创 muduo小结

1、构想:非阻塞IO复用+每个线程负责一个事件循环+线程池2、简化类图(来源于作者):Buffer是TCPConnection成员,其设计用vector,包括预留+可读+可写三个部分。

2017-11-26 10:17:05 300

原创 go:chan分为阻塞和非阻塞

一句话总结:

2017-11-25 22:45:47 8356 1

原创 go:*handler is pointer to interface, not interface

一句话总结:不能声明一个接口的指针,如同不能在C++中不能声明一个指向引用的指针。type handler interface { Do()}var h *handler //errorC++中不能声明一个指向引用的指针int&* p; //error

2017-11-24 23:25:38 2900

原创 go语言中的value receiver和pointer receiver

一句话总结:方法的接收者receiver是t T时,值可以是T活着*T;如果接收者是t *T时,值只能是*T。

2017-11-24 23:18:12 692

原创 找出字符数组中出现次数最多的字符

一道面试题,当时状态不太好,今天重新实现一下。1、暂不考虑最多出现的字符有多个的情况2、用map实现zhaojunyandeMacBook-Pro:~ zhaojunyan$ vim map.cpp zhaojunyandeMacBook-Pro:~ zhaojunyan$ g++ -o map map.cpp zhaojunyandeMacBook

2017-11-19 10:41:14 1389 1

原创 用10只小白鼠找出1000瓶液体中有毒的一瓶

一句话总结:用二进制排列的方法,2^10=1024>1000。想到这个方法后实现还是蛮简单的,1表示喝,0表示不喝0000 0000 0001:第一瓶药0000 0000 0010:第二瓶药0000 0000 0011:第三瓶药。。。。。。0011 1110 1000:第1000瓶药喝完之后,死去的小白鼠表示喝过这瓶毒药,为1,活着的为0。二进制组合代表的数字就

2017-11-19 09:28:59 7292 1

原创 static_cast与强制类型转换的区别

一句话总结:static_cast在编译时会进行类型检查,而强制转换不会。zhaojunyandeMacBook-Pro:~ zhaojunyan$ g++ -o sc sc.cpp sc.cpp:19:9: error:static_cast from 'A *' to 'B *', which are not related by      inheri

2017-11-19 09:20:39 9999 1

原创 线程池的核心实现

一句话总结:用队列实现,生产者添加任务,消费者执行任务;注意原子性操作。#include #include #include #include #include using namespace std;#define THREAD_NUM 3#define QUEUE_SIZE 3typedef boost::function Task;queue queueTask

2017-11-14 20:43:29 276

原创 二叉树三种遍历的非递归算法

一句话总结:借用栈,注意后序遍历确认右子树遍历后才能遍历根。void preorderWithoutRecursion(BTNode* root){ if (NULL == root) { return; } BTNode* p = root; stack s; while (!s.empty() || p) { if (p) { cout data

2017-11-14 20:20:11 271

原创 go——奇怪的iota

一句话总结:const语句块的行索引,从0开始累加。注意与C++中枚举类的区分。1、iota从0开始,b、c依次等于累加的索引2、a1=13、d、e、f、g会等于上面的值,不累加,与枚举类不同。package mainimport "fmt"func main() { const ( a = iota b c a1 = 1 << iota b1 c

2017-11-12 11:46:20 423

原创 总结下进程间通信的方式

类别说明无名管道pipe仅能用于亲缘关系进程间通信,pipe函数可以创建读写管道,当父子进程可以相互收发消息时,注意自己发的消息不要被自己接收到了有名管道fifo以fifo文件作为通信媒介,与普通文件最大的不同在于fifo文件中的内容被读取后就没了,且只能以只读或者只写方式打开。信号可以通过

2017-11-04 17:49:00 367

原创 阻塞模式下socket连接connect超时后长达75秒,如何避免

一句话总结:设置非阻塞,用select等待一段时间看是否连接成功,连接成功再设回阻塞模式。注意select第一个参数一定要加1,否则描述符刚好不在集合当中,会出现超时返回0不可读不可写但send、recv正常的情况。server:#include #include #include #include #include #include #include #incl

2017-11-04 16:02:40 2891

原创 二分查找的递归和非递归实现

#include int bfind(int a[], int val, int start, int end){ int mid = (start+end)/2; if (a[mid] > val) { return bfind(a, val, start, mid); } else if (a[mid] < val) { return bfind(a, val, mi

2017-11-04 14:32:38 236

原创 多线程死锁的产生原因及避免

一句话总结:资源竞争造成的无限等待,可通过加锁时效、死锁检测来避免资源竞争造成的无限等待:1、互斥条件:该进程拥有的资源,其他进程只能等待其释放2、不剥夺条件:该进程拥有的资源只能由其自己释放3、请求和保持条件:请求其他资源,同时自己拥有的资源又不放手4、循环等待:A等待B持有的资源,B等待A持有的资源,一直等待

2017-11-04 10:08:56 550

原创 聊聊epoll的水平触发和边缘触发

一句话总结:水平触发下epoll_wait在文件描述符没有读写完会一直触发,而边缘触发是可读写时触发一次。类别情况水平触发的非阻塞监听sockfd高并发情况下,fd一个一个取,不会漏掉边缘触发的非阻塞监听sockfd高并发情况下可能会有漏掉的情况水平触发的阻塞连接connfd

2017-11-04 09:50:47 1323 1

空空如也

空空如也

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

TA关注的人

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