- 博客(420)
- 资源 (10)
- 收藏
- 关注

原创 000-EMC 深入解读-目录
除了刚毕业的应届生,从来没人敢说他精通 C++,Bjarne Stroustrup (C++ 之父)也不敢说。所以,放弃学习 C++,早日成佛吧。哈,开个玩笑,即便 C++ 虐你千百遍,你还待它如初恋不是?所以你买了很多 C++ 相关的书籍,什么 《C++ primer》、《STL 标准模板库》、《Effective C++》《21 天精通 C++》、《颈椎病康复指南》、《活着》……当然,...
2018-09-15 20:43:27
1856
1

原创 0- Golang 修炼指南
本系列是我的学习笔记,希望大家一起学习,一起进步。如果有错误的地方,及时评论 ^_^. 也可以加群讨论:610441700贡献者:@JovanyWong一、快速入门001 安装 go & 你好,世界 002 go 项目结构 003 渐入渐佳 go 程序 004 统计(一) 005 统计(二) 006 统计(三) 007 绘制三角函数图像(一) 008 绘制三角...
2018-02-08 10:05:06
3284
4

原创 0-Linux 网络编程修炼指南——内功心法
学习交流群: Linux 学习交流群 610441700说明:本系列文章并不能取代 《UNP》这本旷世之作,文章中难免有错误与不足之处,希望读者们遇到有疑问的地方可以加群互相交流,共同进步。写这一系列文章的目的有三个:一是为了提升自己对 linux 的理解,二是锻炼自己能够把知识点讲清楚,三是希望能更好的帮助基础薄弱的同学能够学习 UNP。在学习 unix 网络编程前,请...
2017-04-04 17:09:48
19910
22

原创 0-linux 环境编程修炼指南——外功心法
学习交流群: Linux 环境编程 610441700说明:本系列文章并不能取代 《APUE》这本旷世之作,文章中难免有错误与不足之处,希望读者们遇到有疑问的地方可以加群互相交流,共同进步。写这一系列文章的目的有三个:一是为了提升自己对 Linux 的理解,二是锻炼自己能够把知识点讲清楚,三是希望能更好的帮助基础薄弱的同学能够在学习 APUE。建议学习时间:大于 3 个月...
2016-10-09 20:26:21
33887
6

原创 操作系统修炼指南——保护模式
环境搭建000 实验环境搭建保护模式001 保护模式 002 段寄存器 003 段选择子与段描述符结构 004 段描述符属性分析 005 特权级 006 数据段权限检查 007 代码段权限检查与 jmp 008 跨段提权与调用门 009 调用门(无参) 010 调用门(有参) 011 中断门 012 陷阱门 013
2016-09-14 15:45:01
11030
7
原创 C++ 编写一个解释器
前言一直想知道如何编写一门脚本语言,现在终于有机会实现了。非常感谢 Thorsten Ball 的大作:Writing An Interpreter In Go 帮助我实现了这个想法!Go 是一门非常不错的语言,但是为了锻炼一下自己,使用 C++ 实现了书中的想法,项目地址:https://github.com/ivanallen/autumn 。可能你比较好奇为啥这个项目叫 Autumn...
2019-11-21 20:12:02
7212
6
原创 数据结构与算法学习库——DSA
介绍不少在校学生在学习数据结构与算法时痛苦不堪,很多数据结构写起来验证也很困难。如果有一个库,能帮助大家解决构建数据结构的困难,以快速验证自己的想法,那多好啊。DSA(Data struct & Algorithm) 就是这样的一个工具。示例我们来看一个示例。#include <iostream>#include <string_view>#inclu...
2019-05-01 22:41:17
2943
4
原创 实战:C语言实现用户态线程
0. 前言一直以来,我们学习线程切换与调度,都是通过阅读操作系统书籍或 Linux 源码甚至反汇编 Window 内核代码。无论怎样,这些东西都很抽象,学习起来十分困难。另外,随着现代化编程语言逐渐流行,C++20 的正式发布,都离不开用户态线程这些基础知识。再比如 Golang 的 Goroutine,腾讯公司的开源的 libco,百度的 BRPC 中的 bthread,如果想深刻理解它们,都...
2019-04-22 20:38:09
4961
4
原创 二叉树旋转
本文我们来学习二叉树的另一种操作——旋转。掌握了这个神技,你将会在平衡树的道路上所向披靡。1. 什么是旋转二叉树节点旋转一共有两种操作:左旋和右旋。如图 1 所示,左边的二叉树通过左旋得到右边的二叉树;反之右旋同理。(a, b, c 表示子树,而不是单独表示一个节点) 图1 左旋和右旋 左旋:是以节点的"右分支"为轴,进行逆时针旋转。我们将左旋操作定义为 left_rotate.右...
2019-03-03 20:15:27
12354
1
原创 二叉搜索树
红黑树不仅是二叉树,也是二叉搜索树。如果你想学习红黑树,却不了解二叉搜索树的性质,这就是典型的爬还没学会就想学走。所以本文就来讨论二叉搜索树的一点简单的性质以及操作。在此之前,你需要下载这份代码(C++),并对照实现:https://github.com/ivanallen/dsa1. 性质二叉树中:对于任意一个节点,左孩子的值都它的值小,右孩子的值比它的值大。(二叉搜索树一定满足这个性...
2019-03-02 00:12:30
1625
2
原创 085-包的匿名导入(Blank Import)
转眼间,Golang 的博客从春天写到了冬天,现在我们又回到了原点,不忘初心。那时候我们为了匆匆进入 Golang 的世界,几笔掠过了 Golang 项目结构的相关知识,也粗略的介绍了 Golang 的包相关的概念——《go 项目结构》。我们依靠这点知识,撑到了现在。如今,是时候再为你扩展一些关于 Golang 包以及相关的工具了。1. 介绍一路走来,你一定遇到过这样的情况:如果 import...
2018-10-20 12:30:07
2406
1
原创 084-反射(通过 reflect.Value 修改值)
前面我们学习了一些关于反射的用法,比如:x := 2// 拿到 x 的 Value 对象a := reflect.ValueOf(x)我们可以通过 a 来得知 x 的具体值是多少,那有没有办法通过 a 来修改 x 的值呢?在上面这个例子中,是不行的。1. 可修改性或者说叫可设置性。Value 有一个方法,CanSet,它可以告知你是否可以设置值。还有一个方法就一并讲了,叫 CanA...
2018-10-14 13:17:13
2166
原创 083-反射(序列化 json)
想必你已经掌握了反射的相关操作,也能够遍历结构体的字段和方法,现在我们就要进入实战了。1. 问题正如标题所指,我们的目标是能将任意类型的结构体序列化成 json. 对应的 golang 的encoding/jsong 包就是 Marshal 函数, C++ 的 jsoncpp 库来说就是 write 或 fastwrite 方法,对应到 JavaScript 就是 JSON.stringify...
2018-10-14 12:22:43
1451
原创 003-EMC 深入解读-理解模板型别推导(三)
上一篇文章我们介绍了 ParamType 是引用或指针的情况,这一节继续第二条规则,也是最复杂的规则。ParamType 是引用或指针,但不是通用引用ParamType 是通用引用ParamType 既非指针也非引用1. ParamType 是通用引用首先你得明白,何为通用引用(Universal Reference). 下面是一个比较平易近人的定义:"函数模板中持有型别形参 T ...
2018-09-30 18:15:29
625
4
原创 002-EMC 深入解读-理解模板型别推导(二)
接下来,从三种不同的情况来讨论函数模板推导规则:ParamType 是引用或指针,但不是通用引用ParamType 是通用引用ParamType 既非指针也非引用1. ParamType 是引用或指针,但不是通用引用template&amp;lt;typename T&amp;gt;void f(ParamType param) // 例如:ParamType = T&amp;amp;,ParamT...
2018-09-17 10:32:28
705
原创 001-EMC 深入解读-理解模板型别推导(一)
EMC 第一章条款一,一上来就出个王炸——有关于函数模板的推导规则。1. 问题似乎你在使用的时候并未关注过这些事情,因为一切看起来相当自然,你也用的很爽。比如:template &amp;amp;lt;typename T&amp;amp;gt;T add(T a, T b) { return a + b;}这是一个计算两数之和的函数,你可以传递 float, double, int 等支持 op...
2018-09-17 10:31:33
1174
2
原创 082-反射(结构体字段遍历)
如何知道一个未知结构体包含哪些字段呢?利用反射,可以很容易做到。1. 遍历结构体的 field 和 method还记得 reflect.Type 接口吧,这个接口还包含这 4 个方法:type interface Type { ... NumField() int Field(i int) StructField NumMethod() int ...
2018-09-15 13:41:36
2899
原创 081-反射(Kind)
希望你还能记得反射中的 Type 和 Value 这两个类型。Type 是接口类型,Value 是 Struct 类型;Type 是类型描述,而 Value 是具体的值。这次,我们来看一下 Golang 反射中的另一个重要概念 —— Kind.1. Kind 定义 A Kind represents the specific kind of type that a Type r...
2018-09-08 22:11:17
1302
原创 080-反射(介绍)
接触过 Java 的同学对反射的概念一定不陌生。不过这里大多数同学没接触过 Java,也不用担心。反射是一种能让程序自身去检查和操作变量的一种能力,即使不知道变量的类型也没有关系。在 C++ 里,如果你不知道一个 class 的定义,你就没有办法去调用这个 class 的任何方法,操作这个 class 的任何成员,所以说 C++ 是一种不支持反射能力的语言。这不是说 C++ 办不到这件事情...
2018-08-26 17:08:28
595
原创 079-竞争检测
大多数时候,我们对并发的直觉都是错误的,特别是在多核处理器上更为明显。这也是高并发程序难写的原因。人类想了种种办法来降低程序员犯错误的机率,发明了很多方法。甚至在有些语言里,干脆就不支持多线程了,比如基于 NodeJs 开发的服务器。但在 Golang 里我们无法逃避这种并发竞争。1. 竞争例子下面这个例子开启了 100 个 goroutine,读写全局变量 a.// de...
2018-08-25 20:26:25
665
原创 078-只被执行一次的函数
倘若你看过我的所有文章的话,你肯定还记得曾经在学习《Linux 环境编程》的时候,也有一篇类似的文章,标题和这个一模一样——《只被执行一次的函数》。我强烈建议你回顾一下上面那篇文章。如果你没有《Linux 环境编程》的基础,强烈建议你补习一下,只会 Golang 是不行的。1. 背景相信很多同学都使用过单例模式。如果在单线程程序中,单例模式肯定没啥问题,但是如果在多线程程序中,可能...
2018-08-24 23:32:20
983
原创 077-内存同步
还记得前面的银行账户存款的例子吗?为了解决竞争问题,我们曾经使用了 sync.Mutex 来保护共享变量。特别的,在读取 balance 变量的时候,我们是这样写的:func Balance() int { mu.Lock() defer mu.Unlock() return balance}当时我们说到,这里加锁需要进一步讨论。这种情况也是并发编程里让人感到...
2018-08-12 22:23:11
770
原创 076-使用通信的方式共享内存
希望你还能记得住这句话: “不要使用共享数据的方式进行通信,而应该使用通信的方式来共享数据。”这一节,我们秉承这一理念,来改写前面的银行账户存款问题。1. 思路使用 channel 对控制共享数据。不要将共享数据暴露出去。其实第二条就可以使用第一条来实现。我们使用一个函数来维护这个共享数据。假设该函数叫 monitor.完整的程序如下:// gopl/syn...
2018-08-12 21:29:48
722
原创 075-互斥锁
过去我们在写 C/C++ 程序的时候,总会听到竞争的概念。比如多线程对共享变量的存取,需要加锁才能避免数据不致的问题。在 Golang 中也不例外,多个 Goroutine 存取共享变量,同样也会出现竞争问题。1. 银行转账假设 Alice 有一个银行账户。Alice 会往里存钱,她的好友 Bob 也会转钱给她。用程序来描述应该是这样:package bank// Alice...
2018-08-12 20:55:31
597
原创 074-Context
上一篇文章结束我留下了一下小小的悬念,说 Golang 标准库为我们提供了纯天然的取消并发请求的解决方案,在这里我就需要填坑了。1. 取消并发请求为了能让你快速上手 context,我们继续延续上一篇文章的取消并发请求的例子,使用 context 将其改写。如果你不熟悉上一篇的例子,请务必回去再看一遍。package mainimport ( "context" "...
2018-07-15 17:53:31
523
原创 073-取消并发请求
在服务器开发领域,有很多未知的原因可能导致用户的请求失败。比如:你的服务器并发请求了多个下游服务,并在等待它们返回所有结果。但是很不幸,其中一个服务返回了错误,此时其它所有其它请求我们也就没有必要再等待下去了,而是直接返回并告诉用户本次请求失败。上面的场景在服务器开发领域非常常见,处理起来也比较困难。无论你是写 C++ 还是 Java,或是 Nodejs,都不那么容易处理。多说不益,我们使...
2018-07-15 00:13:04
721
原创 072-火箭发射游戏(select 关键字)
不知不觉,Golang 之路已经走过了一大半。谢谢所有读者一路陪伴,也很欣慰你们能一直坚持下来。接下来,我们进入几篇比较轻松的话题,我不打算在这里全盘托出,让我们从一个火箭发射小游戏开始吧。同样,这个例子来源于《Golang 程序设计》。1. 小小发射器当然,我们并不是真的要开发一套火箭发射程序的代码,只是简单的模拟一下。这对你来说几乎就是小学生的作业。我们的目标如下:从 10 ...
2018-07-11 00:22:53
1863
原创 071-并发爬虫(二)
学习从来都不是一件困难的事情。那为啥我们学习会如此痛苦?其实难在坚持。这就好比跑步并不是一件困难的事,但是难在十年如一日的坚持。如果你仔细一点,会发现我的 csdn 头像是《海贼王》这部动漫的主角头像。海贼王这部动漫从 1997 年开始连载,至今已经连载 21 年了。将一部作品连载至今,需要的不仅仅是智慧,更多的是毅力。如果我们学习也能如此,日复一日,年复一年,我想也应该能有所成就吧。...
2018-07-08 22:23:55
530
原创 070-并发爬虫(一)
关于爬虫(Spider/Crawler),相信你多多少少接触过。比如你老板要你从某网站获取一批企业的黄页信息,这时候爬虫就派上用场了。而本文,我们的任务是编写一个网页抓取程序,提取网页中的 url. 我们的程序可以继续访问抓取到的 url,深度抓取更多的 url.1. 链接抓取器关于这个程序,我就不多废口舌了,你也不必过多的去研究它,掌握用法即可,我们的目的是学习并发。这个程序位于 gop...
2018-07-08 15:08:59
653
原创 069-Go 并发编程(三)
相信你已经对 goroutine 已经轻车熟路了,既然如此,我们来完成一个小任务。1. 故事背景背景是这样,我们的任务分成 3 个阶段。 第一阶段:从 A 工厂采购三种不同材料。第二阶段:你需要带着三种材料,交给 B 工厂 3 个不同的车间去加工。第三阶段:等待 B 工厂所有材料加工完毕,生产出零件后,你才能带上所有零件去 C 工厂组装零件。特别的,在上面的过程中...
2018-07-07 18:23:13
403
原创 068-Go 并发编程(二)
并发编程的难点在于异常处理。今天我们继续研究缩略图的并发编程,还记得之前留下的问题吗?我们的程序没有对程序返回的错误做特殊照顾。在服务器开发领域,这样的程序的显然不够健壮。1. 让程序能够处理错误之前我们的 makeThumbnails 函数没有返回值,现在我们给它添加一个 error 类型的返回值。下面这个程序在 demo04.go 中。func makeThumbnails(f...
2018-07-07 16:56:51
401
原创 067-Go 并发编程(一)
接下来了几篇文章,我们会重点讨论有关 Go 的并发编程以及常见的技术手段。当然,所有问题我们都需要从实例出发,所有的实例均来源于《The Go Programming Language》一书的第 8 章。1. 缩略图计算程序这个例子的目的很简单,给定多幅 jpg 图片,通过调用 Go 里的缩略图处理函数,生成相应的缩略图存储到本地。我们的目的不是写一个如何将图像处理成缩略图的函数,所以...
2018-07-01 17:55:08
589
原创 066-单向 channel
在 Golang 中,channel 也是一种引用数据类型。还记得我们学过哪些引用类型吗?所以 channel 作为参数,函数内对 channel 的修改,会直接影响到函数外面的变量。现在我们把上一节的 pipeline 进行改写,封装成函数的形式。1. 封装 counter 和 squarerpackage mainimport &quot;fmt&quot;// out 参数是传出参数fun...
2018-06-24 21:41:30
1005
原创 065-pipeline
一个程序(函数)只干一件事,将不同的程序通过管道串联起来,完成一件复杂的事情。这是 pipeline 的核心思想。1. 介绍平时工作中,可能你会经常遇到这样的例子:$ cat abc.log | grep "INFO" | awk '{print $5}'abc.log 文件内容如下// abc.log[2018-06-05 21:30:22] [INFO] - id:4...
2018-06-24 00:13:42
651
原创 064-Channel
Golang 里 Channel 是一种数据类型。在 《goroutine 和 chan》 一文我们就探讨过 channel 的特性,它非常像线程安全的阻塞队列,只不过 Golang 里原生支持了它。在 Golang 里,chan 用的最多的地方就是用于 goroutine 之间的通信。很久以前你在学习多线程的时候,线程与线程之间通信的办法,一般都使用共享内存,互斥锁和条件变量这些手段,而...
2018-06-18 22:22:20
889
原创 063-Goroutine
欢迎来到新的章节—— Goroutine &amp;amp;amp;amp;amp;amp;amp;amp;amp; Channel.如果说 goroutine 是 Golang 中的倚天剑,那 channel 就是 Golang 里的屠龙大宝刀。早在第一章,我们就展示过 cotoutine 和 channel 的魅力了,如果你忘记了,可以再次回顾一遍《goroutine 和 chan》。我不会一遍又一遍的给你介绍 goroutine 的概念,一方面是...
2018-06-18 19:17:32
495
原创 062-一些 Go 接口设计建议
Go 语言程序设计一书作者讲了一些关于 Go 语言面向对象编程的经验和建议,如果不拿过来太可惜了。 When designing a new package, novice Go programmers often start by creating a set of interfaces and only later define the concrete types that satis...
2018-06-17 14:10:29
759
原创 061-类型开关(Type Switch)
这一篇仍然是与类型断言相关的,只是稍微再延伸一下。没事,不要怕,没你想象的复杂。到目前为止,关于接口我们已经掌握了它的两种使用方法:实现了同一个接口的不同具体类型都具有共性特征,而接口屏蔽了底层细节。此时我们的关注的是接口的『方法』,而不是类型。使用类型断言,我们可以判断接口值的类型。此时我们关注的是接口的『类型』和『值』,而不是方法。第二种方法通常被描述为 discrimina...
2018-06-17 11:57:04
1496
原创 060-类型断言(Type Assertion)
接口相关的知识中,最重要的不仅仅是了解接口如何实现,接口的构成(类型和值)。另一个非常非常重要的知识点就是类型断言。正好上一篇文章所介绍的,根据接口判断 error 的类型,相当重要,这可以帮助我们根据不同的错误来制定相应的策略。1. 类型断言首先,类型断言,当然只能在接口上进行操作啦。普通对象你都已经知道它的类型了,还有断言的必要吗?对于接口 x,语法形式上像 x.(T) 这样的...
2018-06-16 23:25:26
1583
GCC 内联汇编
2018-10-28
梯度下降法VS2008_C++
2014-10-23
增强版事故树绘制与分析程序
2013-04-19
事故树绘制分析软件
2012-12-17
MFC 音乐播放器
2012-12-12
汇编_单片机_matlab_Multisim等
2010-11-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人