自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 (十五)Go爬虫开发

爬虫简介Go爬虫的实现手段,主要使用的还是net/http这个包。它不仅可以接收浏览器发送过来的请求,实现服务器的功能,也可以模拟浏览器向其它的服务器发送请求。基本的流程如下:构建、发送请求链接获取服务器返回的响应数据过滤、保存、使用得到的数据关闭请求链接。打印出完整的网页内容,和浏览器获取的内容是一样的。只不过我们写的.go程序是直接将服务器返回的所有数据内容打印出来,而浏览器是将服务器返回的内容(代码)按照既定的方式加以执行并显示给用户看,所以我们在浏览器上会看到文字,图片等信息。*

2020-05-28 23:03:53 814

原创 (十四)Go聊天室实践

并发编程和网络编程是现今行业开发中常用的技术。Go语言强大的语法设定使得并发和网络编程都变的简洁而高效。下面使用并发和网络实现一个简单的网络在线聊天室。在整个聊天室的项目中,充分利用了协程并发,处理不同任务。模块划分整个聊天室程序可简单划分为如下模块,都分别使用协程来实现:主协程(服务器):负责监听、接收用户(客户端)连接请求,建立通信关系。同时启动相应的协程处理任务。处理用户连接协程:HandleConnect:负责新上线用户的存储,用户消息读取、发送,用户改名、下线处理及超时处理。

2020-05-26 04:59:33 454

原创 (十三)Go网络编程

网络介绍网络协议从应用的角度出发,协议可理解为规则,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。规定:第一次,传输文件名,接收方接收到文件名,应答OK给传输方;第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK;第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则即为协议。这

2020-05-23 21:21:22 427

原创 (十二)Go文件处理

Go 运行中的数据保存在内存中。如果希望数据长久的保存在电脑中,这就需要使用 Go 生成文件,添加数据了。创建文件GO语言中提供了一个Create( )函数专门创建文件。该函数在创建文件时,首先会判断要创建的文件是否存在,如果不存在,则创建,如果存在,会先将文件中已有的数据清空。同时,当文件创建成功后默认会打开文件,所以不用再执行打开操作,可以直接向该文件中写入数据。import "os"func CreateFile(path string) { // 创建文件,返回两个值 /

2020-05-21 01:36:36 659

原创 (十一)Go字符串

字符编码Go 语言中的标识符可以包含任何 Unicode 编码可以表示的字母字符。把整数转换为 string 的时候,被转换整数应该可以代表一个有效 Unicode, 否则转换结果是"�",即:一个仅由高亮的问号组成的字符串值。string 类型值别转换为 []rune 类型时,其字符串会拆分成一个个 Unicode 字符。Go 语言采用的字符编码方案从属于 Unicode 编码规范,其源码文件必须使用 UTF-8 编码格式进行存储。ASCII 编码ASCII 编码方案使用单个字节(byte)的二进

2020-05-19 07:00:36 254

原创 (十)Go同步通讯

sync同步“sync”的中文意思是“同步”。相比于 Go 语言宣扬的“用通讯的方式共享数据”,通过共享数据的方式来传递信息和协调线程运行的做法其实更加主流,目前大多数的现代编程语言都是用后一种方式作为并发编程的解决方案的。一旦数据被多个线程共享,那么就很可能会产生争用和冲突的情况。这种情况也被称为竞态条件(race condition),这往往会破坏共享数据的一致性。同步的用途有两个:避免多个线程在同一时刻操作同一个数据块协调多个线程,避免它们在同一时刻执行同一个代码块由于这样的数据块和代

2020-05-17 23:00:54 382

原创 (九)Go通道笔记

通道(channel)是Go 语言的一种特色类型。利用通道可以在多个 goroutine 之间传递数据。通道类型的值是并发安全的,也是 Go 语言自带的、唯一一个可以满足并发安全性的类型。通道的使用在声明并初始化一个通道的时候,需要用到 Go 语言的内建函数make。就像用make初始化切片那样,我们传给这个函数的第一个参数应该是代表了通道的具体类型的类型字面量,此外,还可以接收一个int型的参数(可选),用来表示通道容量。所谓通道的容量,就是指通道最多可以缓存多少个元素值。由此,虽然这个参数是in

2020-05-16 17:10:12 237

原创 (八)Goroutine 笔记

支持高并发编程模式是 Go 的一大特色。其中,Goroutine(协程)是 Go 中最基本的执行单元。每个 Go 程序至少包含一个 主 Goroutine。并发与并行区别:并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。...

2020-05-06 21:54:20 210

原创 (七)Go测试与性能调优

测试传统测试测试数据和测试逻辑混在一起出错信息不明确一旦一个数据出错测试全部结束@Test public void testAdd() { assertEquals(3, add(1, 2)); assertEquals(2, add(0, 2)); assertEquals(Integer.MIN_VALUE, add(1, Integer.MAX_VALU...

2020-04-30 00:29:22 514

原创 (六)Go错误处理和资源管理

defer调用defer调用也是一种流程控制语句,经常用来调用一些资源处理函数。确保调用在函数结束时发生,defer 调用必须出行在函数内,并且在该函数返回之前才会去执行 defer 调用的函数。简单示例func testdefer(){ // defer在函数最后才去执行。 defer fmt.Println("2") fmt.Println("1")} func mai...

2020-04-29 09:36:36 221

原创 (五)Go函数式编程

函数与闭包闭包就是指有权访问另一个函数作用域中的变量的函数。闭包由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。正常情况下,外部函数调用完后其内部变量对象就应该被销毁,但闭包的存在使得我们仍然能够访问外部函数的变量对象。Go语言对函数式编程主要是体现在闭包上面。函数式编程 vs 函数指针:函数是一等公民:参数,变量,返回值都可以是函数(c++里只...

2020-04-27 23:00:27 238

原创 (四)Go面向接口笔记

duck typing鸭子类型含义: 像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子。用于描述事物得外部行为而非内部结构,不强制限定传入的参数的类,只要具有相关的属性和方法就能执行成功。JavaScript 的 duck typingfunction download(reciver) { reciver.get('test')}// 只要传入参数有 get 方法就能调用成...

2020-04-27 00:57:48 117

原创 (三)Go 面向对象笔记

Go 语言中没有 class ,不支持继承等面向对象的概念。Go 语言的结构体与“类”都是复合结构体,但 Go 语言中结构体的内嵌配合接口比面向对象具有更高的扩展性和灵活性。Go 语言的类型可以被实例化,使用new或&构造的类型实例的类型是类型的指针。结构体和方法结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。结构体的定义只是内存布局描述,还没分配内存,当结构体实例化后,...

2020-04-26 08:46:48 117

原创 (二)Go 内建容器笔记

数组Go 语言提供了数组类型的数据结构。数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。声明数组语句:// var variable_name [SIZE] variable_typevar balance [10] float32初始化数组// 初始化元素的个数不能超过 []中的数字。var array1 =...

2020-04-25 13:44:56 140

原创 Eggjs学习系列(九) 插件开发实践

插件机制是 Egg 框架的一大特色。它不但可以保证框架核心的足够精简、稳定、高效,还可以促进业务逻辑的复用,生态圈的形成。插件也跟应用一样,包含了 Service、中间件、extend等等,没有独立的 Router 和 Controller,也没有 plugin.js 这份插件配置文件。搭建开发环境使用 Egg 提供的脚手架 egg-boilerplate-plugin 来开发插件$ ...

2020-04-24 09:53:48 2214 1

原创 (一)Go 语言基础笔记

变量声明Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。声明变量的一般形式是使用 var 关键字,可一次声明多个变量var identifier1, identifier2 type // 变量类型都为 type如果没有声明变量类型, Go 语言会自动推断出变量类型。var d = true // 变量类型为 bool当一个变量被声明之后,系统自动赋予它该类型的零值...

2020-04-24 01:19:20 300

原创 Eggjs学习系列(八)加载器

Egg 是在 Koa 基础上封装并增加了一些约定的框架,通过加载器(Loader)来加载不同目录下代码,实现各种的功能,要开发 Eggjs 插件和框架,首先要了解 Eggjs 的加载器。应用、框架、插件要了解加载器,首先要了解 Egg 框架的结构。Egg 应用通过框架运行起来并根据功能需要加载插件。插件只完成特定功能,通过配置依赖,在 config/plugin.ts 中开启插件。impor...

2020-04-23 13:42:52 892

原创 JavaScript装饰器实践

装饰器(Decorator)是一种设计模式,通过装饰器可以注释或修改类和类方法,而不必重复编写代码,提高开发效率。许多面向对象的语言都有这项功能。装饰器模式Decorator 是ES7中添加的JavaScript新特性。而在 TypeScript 中,很早就支持 Decorator 了。说到 Decorator ,首先要来了解装饰器模式。装饰器模式的定义是“在不改变原对象的基础上,通过对其进行...

2020-04-22 01:49:21 283

原创 Eggjs学习系列(七) 多进程实践

JavaScript 是单线程的,只能运行在一个CPU上,这样不能充分发挥计算机的性能。为了更好地利用多核环境,Node.js 提供了 Cluster 模块,可以方便的创建多个子进程,提高项目运行效率。Cluster 模块Cluster 模块将进程分为 Master 进程和 Worker 进程:负责启动其他进程的叫做 Master 进程,只负责启动其他进程。其他被启动的叫 Worker ...

2020-04-17 00:56:14 3587

原创 Eggjs学习系列(六) Socket.IO实践

Eggjs学习系列(六) Socket.IO实践Socket.IO 是一个基于 Node.js 的实时应用程序框架,在即时通讯、通知与消息推送,实时分析等场景中有较为广泛的应用。Eggjs提供了 egg-socket.io插件来实现 websocket 通信,并增加了下列开发规约:namespace: 通过配置的方式定义 namespace(命名空间)middleware: 对每一次...

2020-04-16 16:57:17 5211 4

原创 Eggjs学习系列(五) Sequelize的使用

Eggjs学习系列(五) Sequelize的使用简单的数据库操作通过使用egg-mysql 插件基本上可以满足需求,而在一些较为复杂的应用中,我们可能会需要一个 ORM 框架来帮助我们管理数据层的代码。sequelize 是一个广泛使用的 ORM 框架,支持多种数据库。ORM 即使用面向对象的方式,通过操作对象来实现与数据库之前的交流,完成CRUD的动作。安装和配置插件由于我们使用的是 T...

2020-04-16 14:05:15 3346 1

原创 ArrayBuffer 实践

ArrayBuffer 实践ArrayBuffer对象、TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口。都是以数组的语法处理二进制数据,所以统称为二进制数组。主要用于二进制数据的通信。ArrayBuffer 以数组的形式直接操作内存,提升了脚本的性能。二进制数组由三类对象组成。ArrayBuffer 对象TypedArray 视图D...

2020-04-16 01:18:49 388

原创 Eggjs学习系列(四) 数据库操作

Eggjs学习系列(四) 数据库操作操作数据库是后端日常开发中必不可少的一个环节。Egg.js也提供了相应的插件,其中,最常用的是egg-mysql,用来访问操作数据库。egg-mysql安装和配置插件npm i --save egg-mysql安装完成插件后,在 config 中开启和配置插件。// config/plugin.tsimport { EggPlugin } fr...

2020-04-15 10:47:50 1548 1

原创 Eggjs学习系列(三) 爬虫项目进阶

Eggjs学习系列(三) 爬虫项目进阶通过上一次爬虫项目实战,初步完成了网页内容的抓取和展示,接下是给网站添加登录功能。登录功能首先编写基本的登录页面<!-- app/view/news/login.tpl --><!DOCTYPE html><html lang="en"><head> <meta charset="UT...

2020-04-14 10:42:56 501 1

原创 Eggjs学习系列(二) 爬虫项目实战

Eggjs框架结构路由Router 主要用来描述请求 URL 和 Controller 的对应关系, 框架的 app/router.js 文件统一管理路由规则。// app/router.tsimport { Application } from 'egg';// 定义 URL 路由规则export default (app: Application) => { cons...

2020-04-13 08:04:53 1639 2

原创 Eggjs学习系列(一) 使用TypeScript快速入门

Eggjs学习系列(一) 使用TypeScript快速入门Eggjs是一个node的渐近式开发框架,用于服务端开发。而 TypeScript 是 JavaScript的超集,在兼容 JavaScript的基础上增加了类型检查、智能提示等特性,适用于大规模的企业项目开发。下面是Eggjs在 TypeScript 下的基本实践案例:快速入门使用 TypeScript 初始化项目npm init...

2020-04-12 18:18:24 3888

原创 C语言内存管理实践

C语言内存管理作用域C语言变量的作用域分为:代码块作用域(代码块是{}之间的一段代码)函数作用域文件作用域局部变量局部变量也叫auto自动变量(auto可写可不写),一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点:在一个函数内定义,只在函数范围内有效在复合语句中定义,只在复合语句中有效随着函数调用的结束或复合语句的结束局部变量的声明声明周期也结束如果没有赋...

2020-04-08 22:03:29 157

原创 C++友元实践

C++友元类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问。但是,有时候需要在类的外部访问类的私有成员,怎么办?友元函数提供了一种解决方法,友元函数是一种特权函数,c++允许这个特权函数访问私有成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。程序员可以把一个全局函数、某个类中的成员函数、甚至整个类声明为友元。友元语法friend关键字...

2020-04-08 11:05:04 106

原创 C++ 修饰符使用总结

C++ 修饰符使用总结基础类型修饰符C++ 允许在 char、int 和 double 等基础数据类型前放置修饰符。基本类型常用的修饰符有:signedunsignedlongshort修饰符 signed、unsigned、long 和 short 可应用于整型,signed 和 unsigned 可应用于字符型,long 可应用于双精度型。修饰符 signe...

2020-04-07 11:41:29 999

原创 C++引用使用总结

C++引用引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。引用是指针的另一种表示方式。引用与指针区别:引用很容易与指针混淆,它们之间有三个主要的不同:引用不能为空。引用指定过后不能修改。引用必须在创建时初始化。基本用法Type& ref = val;案例:#include <...

2020-04-06 23:23:08 115

原创 C语言const关键字详解

const 在实际编程中用得并不多,const 是 constant 的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。说 const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:const int a = 10;con...

2020-04-06 02:02:45 4053

原创 C语言的typeof关键字

c语言中typeof关键字,是C语言中的一个新扩展。typeof的参数可以是两种形式:表达式或类型。下面这两个等效声明,用于声明int类弄的变量atypeof(int) a;typeof('b') a; //相当于获取'b'的类型,定义一个变量a// GCC中这个表达式的类型是int(自动提升为int),// 注意typeof(char)和typeof('b')得到的不是一样的,这个用s...

2020-04-05 21:31:42 819

原创 理解void和sizeof关键字

void的字面值是“无类型”,void*则是"无类型指针"。void*可以指向任何类型的数据。void几乎只有"注释"和限制程序的作用,因为从来没有人会定义一个void变量。void a;    //编译时提示"illegal use of type 'void'"void真正发挥的作用在于:对函数返回的限定对函数参数的限定如果指针p1和p2的类型相同,那么p1和p2之间可互相赋值...

2020-04-05 18:03:23 779

空空如也

空空如也

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

TA关注的人

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