async/await 如何工作 | Rust学习笔记

2019年底Rust正式支持 async/await语法,完成了Rust协程的最后一块拼图,从而异步代码可以用一种类似于Go的简洁方式来书写。然而对于程序员来讲,还是很有必要理解async/await的实现原理。async简单地说,async语法生成一个实现 Future 对象。如下async函数:async fn foo() -> { ... }async关键字,将函数的原型修改为返回一个Future trait object。然后将执行的结果包装在一个新的future中返回,大致相当于:fn...阅读全文

Segmentfault 2020-09-30 10:32:32 Netwarps

高频golang面试题:简单聊聊内存逃逸?

问题知道golang的内存逃逸吗?什么情况下会发生内存逃逸?怎么答golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它 逃逸 了,必须在堆上分配。能引起变量逃逸到堆上的典型情况:在方法内把局部变量指针返回 局部变量原本应该在栈中分配,在栈中回收。但是由于返回时被外部引用,因此其生命周期大于栈,则溢出。发送指针或带有指针的值到 channel 中。 在编译时,是没有办法知道哪个 goroutine 会在 ch...阅读全文

Segmentfault 2020-09-28 14:32:39 ilini

在 Go 中实现 Monkey Patch

背景在进行单元测试的时候,通过 testify框架 对测试函数的数据和所依赖的方法做 mock,但是单测出现 panic。 根据错误提示,被测试函数调用了 time.Now(), 因为会对比这个函数返回值, 所以本次单测没有跑通过。下面介绍通过 monkey patch 来解决这个问题。问题复现示例代码如下,HandleEvent() 处理一个 Webhook 的回调事件,使用 time.Now() 标识事件处理的时间点:func (e *eventSrv) HandleEvent(ctx co...阅读全文

Segmentfault 2020-09-27 23:32:32 lryong

Golang设计模式-观察者模式

观察者模式 观察者模式定义了对象之间一对多依赖,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。有新类型的观察者出现时,主题的代码不需要修改,主题不在乎别的,他只会发送通知到所有注册并实现了观察者接口的对象。为了交互对象之间的松耦合涉及而努力。 观察者模式的要点有如下几点: Subject 一定要包含一个Observer 接口的列表 Subject 要实现Attach函数来新增Observer Subject 要实现Notify函数,遍历Observer的列表,并调用每一个obser...阅读全文

简书 2020-09-21 23:32:40 perfect6566

Golang中没有Struct的动态JSON解析器

Gabs是一个小型实用程序,用于处理Go中的动态或未知JSON结构。它不需要您知道有效负载的结构(例如,创建结构),并且可以通过提供指向它们的路径来访问字段。它几乎只是一个有用的包装,用于导航由encoding / json包提供的map [string] interface {}对象的层次结构。除了出色之外,它没有任何壮观的东西。 安装 go get github.com/Jeffail/gabs 例子 package main import ( "fmt" "github.com/Jeffa...阅读全文

简书 2020-09-21 23:32:40 追梦人在路上不断追寻

高并发优雅的做限流

技术分析如果你比较关注现在的技术形式,就会知道微服务现在火的一塌糊涂,当然,事物都有两面性,微服务也不是解决技术,架构等问题的万能钥匙。如果服务化带来的利大于弊,菜菜还是推荐将系统服务化。随着服务化的进程的不断演化,各种概念以及技术随之而来。任何一种方案都是为了解决问题而存在。比如:熔断设计,接口幂等性设计,重试机制设计,还有今天菜菜要说的限流设计,等等这些技术几乎都充斥在每个系统中。就今天来说的限流,书面意思和作用一致,就是为了限制,通过对并发访问或者请求进行限速或者一个时间窗口内的请求进行限...阅读全文

Segmentfault 2020-09-27 20:32:33 菜菜

Golang标准库——crypto(1)

aes cipher des dsa ecdsa elliptic crypto crypto包搜集了常用的密码(算法)常量。 type PublicKey type PublicKey interface{} 代表一个使用未指定算法的公钥。 type PrivateKey type PrivateKey interface{} 代表一个使用未指定算法的私钥。 type Hash type Hash uint Hash用来识别/标识另一个包里实现的加密函数。 const ( MD4 Hash =...阅读全文

简书 2020-09-21 21:32:41 DevilRoshan

Golang标准库——crypto(2)

hmac md5 rand rc4 rsa sha1 sha256 sha512 subtle hmac hmac包实现了U.S. Federal Information Processing Standards Publication 198规定的HMAC(加密哈希信息认证码)。 HMAC是使用key标记信息的加密hash。接收者使用相同的key逆运算来认证hash。 出于安全目的,接收者应使用Equal函数比较认证码: // 如果messageMAC是message的合法HMAC标签,函数返...阅读全文

简书 2020-09-21 21:32:41 DevilRoshan

mongodb 安装、配置,迁移

安装并迁移mongodb数据 之前通过golang连接安装好的mongodb一直不成功,今天重新安装部署下mongodb,并且做了一次数据迁移,结果是成功的。 参考文档: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 操作步骤 移除已经安装的mogodb yum erase $(rpm -qa | grep mongodb-org) 移除之前的日志目录,数据目录 rm -rf /app/mongodb/l...阅读全文

简书 2020-09-21 21:32:40 运维之美Bially

linux下C++多线程并发之原子操作与无锁编程

一、何为原子操作原子操作:顾名思义就是不可分割的操作,该操作只存在未开始和已完成两种状态,不存在中间状态;原子类型:原子库中定义的数据类型,对这些类型的所有操作都是原子的,包括通过原子类模板std::atomic< T >实例化的数据类型,也都是支持原子操作的。二、如何使用原子类型2.1 原子库atomic支持的原子操作原子库< atomic >中提供了一些基本原子类型,也可以通过原子类模板实例化一个原子对象,下面列出一些基本原子类型及相应的特化模板如下: 对原子类型的访问,最主要的就是读和写,...阅读全文

简书 2020-09-21 21:32:40 linux大本营

golang 抓取网页并将其他编码(gbk,gb2312,big5等)中文文字转换成uft8编码的字符串处理函数

最近用golang采集网页中遇到了各种不能识别的的乱码字符串,他们大多编码是gbk、gb2312、big5、windows-1252 等编码。有时候,网页上并没有声明编码,却使用上面这种编码的网页也有,也有网页声明的编码和实际使用的编码不同的网页,导致网页编码转换工作带来诸多不便,更多的是根据提示的编码转换出来依然还是乱码的问题,着实让人头疼。于是乎,为了得到一个通用可行的中文字符串编码转换方法,本人通过网络上上百万个网站测试,采集数据回来进行编码转换,终于总结出来了一套绝大部分都能顺利将网页中...阅读全文

Golang 在 Mac、Linux、Windows 下交叉编译

Golang在跨平台方面做的非常不错,支持平台之间的交叉编译,可以在一个平台上生成另一个平台的可执行程序,非常好用,下面不同平台的交叉编译命令: 1. Windows系统 1.1)Windows 下编译 Linux 64位系统的可执行程序 SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go 1.2)Windows 下编译 macOS 64位系统的可执行程序 SET CGO_ENABLED=0 SET GOOS=da...阅读全文

简书 2020-09-21 21:32:38 Todd_efe5

golang 抓取网页并将其他编码(gbk,gb2312,big5等)中文文字转换成uft8编码的字符串处理函数

最近用golang采集网页中遇到了各种不能识别的的乱码字符串,他们大多编码是gbk、gb2312、big5、windows-1252 等编码。有时候,网页上并没有声明编码,却使用上面这种编码的网页也有,也有网页声明的编码和实际使用的编码不同的网页,导致网页编码转换工作带来诸多不便,更多的是根据提示的编码转换出来依然还是乱码的问题,着实让人头疼。于是乎,为了得到一个通用可行的中文字符串编码转换方法,本人通过网络上上百万个网站测试,采集数据回来进行编码转换,终于总结出来了一套绝大部分都能顺利将网页中...阅读全文

Segmentfault 2020-09-27 15:32:32 开发小程序的之朴

2147483647 一个神奇的数字

error: Error 1062: Duplicate entry '134314-2147483647' for key 'xxxx'这是条MySQL insert语句报的错误,按照常规的思路来看,就是唯一索引重复了。所以开始检查insert的内容是否有重复,但是却没有搜索到2147483647 这个数字后来想了一下,灵光一闪~发现数据库的字段类型是int 这意味着 INT4-21474836482147483647所以当写入的数字特别大溢出的时候,就会写入的数字都变成2147483647阅读全文

Segmentfault 2020-09-27 00:32:32 jaysun

爬虫代理的cookie生成运行

HTTP是用于互联网传输数据信息到本地的一种传送协议我们在浏览器中输入输入关键词,会返回页面内容。这就是我们用浏览器向网站所在的服务器发送了一个请求,网站的服务器接收到这个请求后进行解析,然后把网页内容呈现出来。有时候服务器网站会检测IP在一个时间段内的请求次数,如果过于频繁,就会拒绝服务,简称为封IP。HTTP代理就是用别人的IP进行访问,进行IP伪装。除非是访问网站或APP专用数据api接口,正常的HTTP请求都需要进行ua(User-Agent)优化,因为ua是浏览器标识,如果http请求...阅读全文

Go语言中文网 2020-09-21 17:33:55 laical

The Way To Go --- 切片

初识切片基本使用在go语言中一般不使用数组,大多都是使用切片(slice),看一个切片的示例 arr := [...]int{0,1,2,3,4,5,6,7,8} s := arr[2:6] 这里定的s就是切片,上边的arr是一个数组,这里s的结果是[2,3,4,5](取arr中3到5这个区间的数据,是左闭右开的)切片还有很多的用法,如下: arr := [...]int{0,1,2,3,4,5,6,7,8} fmt.Println("arr[2:6] = ", arr[2:6]) fmt.Pr...阅读全文

Segmentfault 2020-09-26 21:32:33 书旅

Golang Defer详解

在用Golang开发的时候,defer这个语法也是必备的知识,但是我们除了知道他是在一个函数退出之前执行,对于defer是否还有其他地方需要注意的呢。本文整理的defer的全场景使用情况,部分场景源自网络,加上自己的额外观点和分析,完成了这份defer的7个隐性必备知识点。提纲 知识点1:defer的执行顺序 知识点2: defer与return谁先谁后 知识点3:函数的返回值初始化与defer间接影响 知识点4:有名函数返回值遇见defer情况 知识点5:defer遇见panic 知识点6:d...阅读全文

51CTO博客 2020-09-21 14:06:19 王小酸

golang高频面试题:字符串转成byte数组,会发生内存拷贝吗?

问题字符串转成byte数组,会发生内存拷贝吗?怎么答字符串转成切片,会产生拷贝。严格来说,只要是发生类型强转都会发生内存拷贝。那么问题来了。 频繁的内存拷贝操作听起来对性能不大友好。有没有什么办法可以在字符串转成切片的时候不用发生拷贝呢?代码实现解释StringHeader是字符串在go的底层结构。SliceHeader是切片在go的底层结构。那么如果想要在底层转换二者,只需要把 StringHeader的地址强转成 SliceHeader就行。那么go有个很强的包叫 unsafe。1.unsa...阅读全文

Segmentfault 2020-09-25 16:32:41 ilini