自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 GO性能优化指北-高效内存分配

绝大多数时候我们不需要关注内存管理, go运行时会自行处理, 但是对于热点路径, 我们必须确保高效地内存分配来榨取每一点性能就内存分配而言, 有两件事情可以帮助我们提升性能: 1. 减少分配, 如将fmt.Sprintf改为fmt.Fprintf来避免创建新的字符串或者尽量使用[]byte而不是string来重用 2. 尽量避免在堆上的分配, 分配在堆的内存会增加GC花费从而降低性能, 本文将试...

2020-04-20 18:23:09 609

原创 GO运行组件浅析-内存分配

概念介绍page大小为8Kb的内存块span由多个地址连续的页(page)组成的大块内存.分配器按照页数来区分不同大小的span.但是span大小不是固定不变的,可能发生裁剪和合并操作:如果获取闲置span的时候没有找到大小合适的,就会找到一个更大的span,然后对其做裁剪操作,多余部分构成新的span被放回管理数组.如果有地址相邻的空闲span,分配器就会试图合并来构建更大的内存...

2020-04-18 20:22:40 460

原创 GO工具链简易入门-go list

目录快速上手一些常用指令查找编译会涉及到的所有文件查找直接依赖以及所有依赖(包括间接)使用模板函数(template function)模块版本下列举当前模块的规范名字, 版本和可取代物(replacement)列举当前模块及其所有依赖的规范名字, 版本和可取代物列举当前模块的依赖可用更新FAQ模板函数context返回的结构体模板函数module解释Module结构体如下结论参考快速上手我们...

2020-04-17 16:51:50 868

原创 GO工具链简易入门-go vet

文章目录快速上手go vet会检查什么?查找所有选项对于原子性函数的不寻常使用(atomic)锁复制(copylocks)循环闭包(loopclosure)没有取消context(lostcancel)没有实现标准库要求接口(stdmethods)不合约定的字段标签(structtag)其他选项定制分析器定制指令参考快速上手一个简单的命令就是go vet [directory]返回结果大约如...

2020-04-17 15:09:43 908

原创 sync.Pool使用与实现

之所以需要单独提及sync.Pool是因为 1. 它对于性能优化非常重要,gin利用sync.Pool来重新利用context, fasthttp更是专门提及"sync.Pool is your best friend."。2. 由于其引入就是为了优化性能,因此我们可以从源码中了解到很多优化的技巧。Sync.Pool的使用sync.Pool用于并发安全的获取和存储一组对象,这个结构体只有两个方...

2020-04-05 20:49:59 1156

原创 GO标准库巡礼-context

简述context包的核心内容是定义了Context类型,Context可以携带DDL信号、取消信号以及基于请求的数据在函数之间传递。context一个常见的应用场景是在服务器处理请求上。这个过程我们可能会创建很多goroutine来完成对请求的处理,一方面我们往往需要一个全局性的方式能够快速的结束所有goroutine,其中的原因可能是用户停止了请求或者说处理已经超时没必要继续处理,另一方面...

2020-03-26 15:06:57 164

原创 GO-如何设置可选参数

什么是可选参数(optional parameter)?可能很多人没明白什么是可选参数,可选参数即我们可以设置也可以不设置的参数,如果我们不设置,则会使用默认值。在JAVA中我们可以用函数重载(overloading)来实现可选参数(如下述代码所示),可以看到如果我们不需要修改A我们可以直接使用doSomething,如果我们需要修改A,可以使用doSomethingpublic class...

2020-03-26 15:04:51 3073

原创 GO标准库巡礼-fmt

fmt模板fmt中的转义词%v通用占位符,该占位符会自动转换变量为string(以默认选项)。通常用于转换基础类型%#v会将变量转换为符合go syntax的输出,也就是说我们可以直接复制输出结果然后粘贴到代码中而不会报错。我们可以看一个例子来加深理解func main() { c := struct { hello string world string }{"...

2020-03-24 16:52:50 154

原创 GO标准库巡礼-strconv

作为初学者,我们可能常常首先接触到的是 fmt 包,但是对于基础类型的转换而言, strconv 包更加高效且允许编译器类型检查。strconv 针对四种基础类型提供了相应的函数:布尔值,整数,浮点数和字符串。整数操作如何从字符串中解析出有符号整数和无符号整数?如何将有/无符号整数转化为字符串浮点数操作如何从字符串中解析出浮点数?我们可以使用ParseFloat函数,函数定义...

2020-03-23 16:09:30 173

原创 GO标准库巡礼-encoding/binary

encoding/binary回想区为什么除了encoding/json,我们还需要encoding/binary?文本协议和二进制协议区别是什么?什么是字节序?能否举一个例子说明字节序不同带来的变化?为什么要引入小端法?优点是什么?什么是网络字节序?如何从字节切片中读取一个定长整数?如何将一个定长整数写入到字节切片中?如何从比特流中读取一个定长整数?如何从比特流中写入一个定长...

2020-03-22 16:25:19 1197 1

原创 GO标准库巡礼-sync

在go中sync负责提供同步原语如互斥锁等。任何属于该包类型的对象都不应该被复制(只能passed by pointer)sync.Mutexsync.Mutex是最常用的同步原语。其作用在于对共享资源的互斥访问。常用的使用范式mutex := &sync.Mutex{}mutex.Lock()// Update shared variable (e.g. slice, po...

2020-03-19 22:42:45 170

原创 sync.Map详解

sync.Map简述简单来说,sync.Map是并发版本的map,golang自带的map在并发操作下会触发panic。sync.Map支持Load,Store, LoadOrStore,Range,Delete操作。其中Range支持在多goroutine下运作,能确保每个key最多被处理一次,但是无法保证遍历过程中实时同步其他goroutine的增删操作。使用sync.Map你真的需要s...

2020-03-19 17:27:46 6438 2

原创 GO标准库巡礼-bufio

声明:该系列文章是基于对@golangspec、go官方文档、《Go语言标准库》的学习汇总而成bufio封装了io.Reader和io.Writer并且通过缓存来提高性能。bufio.Writer为什么需要buffer?在没有buffer的情况下,我们的writer函数会调用系统调用来完成一次写入,而小量写入下,系统调用的时间花销远远大于写入本身的花销。因此,过多的小量写入会大大影响性能。...

2020-03-18 15:32:58 321

原创 GO标准库巡礼-ioutil

声明:该系列文章是基于对@benbjohnson的《Go Walkthrough》、go官方文档、《Go语言标准库》的学习汇总而成ioutil提供了一些简单的IO操作函数作为辅助Reader与ReadCloser的简单转换有些时候我们有一个io.Reader的实例,但是我们要求传递io.ReadCloser的实例,那么我们可以使用NopCloser函数func NopCloser(r io...

2020-03-05 17:04:36 273

原创 GO标准库巡礼-bytes与strings

声明:该系列文章是基于对@benbjohnson的《Go Walkthrough》、go官方文档、《Go语言标准库》的学习汇总而成bytes和strings简单对比[]byte表示了一组可修改、可扩展、连续性的byte列表。而string表示不可修改、固定长度、连续的byte列表。这意味着你不能更新字符串,只能创建,而这可能带来很大的负担从使用者角度来看,字符串更易于使用,能作为map的键。...

2020-02-23 23:18:46 620

原创 GO标准库巡礼-IO

声明:该系列文章是基于对@benbjohnson的《Go Walkthrough》、go官方文档、《Go语言标准库》的学习汇总而成io包为I/O提供了基本的接口,由于这些接口都以不同实现封装了低级操作,因此,除非另行通知,不应假定它们是线程安全的读取bytesReader接口在读取bytes上最常用到的是Reader接口,标准库的每一个模块几乎都实现了该接口type Reader int...

2020-02-22 18:59:12 301

原创 UNIX网络编程(UNP) 第二十六章学习笔记

概述传统unix中,如果一个进程需要另一个实体完成某事,就会fork一个子进程然后让其执行。但是fork调用存在着以下几个问题:fork是昂贵的。fork要将父进程的内存映像复制到子进程,并在子进程复制所有描述符。即便现在使用了“写时复制”技术,fork依然是昂贵的fork返回之后,父子进程之间的通信需要进程间通信(IPC)。调用fork之前父进程向子进程传递信息是容易的,但是子进...

2020-02-06 18:13:09 239

原创 UNIX网络编程(UNP) 第十六章学习笔记

概述套接字默认是阻塞的,可能阻塞的套接字调用可以分为以下四类读取操作。包括read,reav,recv,recvfrom和recvmsg五个函数。如果进程对阻塞的TCP套接字调用这些函数,而接收缓冲区没有数据可读,那么进程就会沉睡直到有数据可读(无论是一个字节还是说一个完整的TCP分节的数据)。如果需要等到足够数目的数据可读,那么可以用MSG_WAITALL状态或者调用我们自己的readn...

2020-02-05 18:00:41 257

原创 UNIX网络编程(UNP) 第十五章学习笔记

概述Unix域不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,使用的API就是套接字API之所以使用Unix域而不是TCP,是因为在一个主机中,unix域协议往往比TCP快一倍多,unix域协议还可以用于同一个主机上不同进程之间传递描述符,而且通过提供客户的凭证(用户ID和组ID)给服务器,提供了额外的安全检查措施Unix域套接字地址结构struct sockadd...

2020-02-03 15:49:29 214

原创 UNIX网络编程(UNP) 第十四章学习笔记

概述本章中我们需要学习如何为I/O操作设置超时、以及如何使用read write的若干个变体、还有如何确定缓冲区中的数据量套接字超时总的来说 ,有什么方法 ?调用alarm,会在指定时间满了之后引发SIGALRM信号。这个方法缺点在于,需要涉及到信号处理,而信号处理在不同实现上有差异,而且可能干扰进程现有的alarm调用在select上阻塞等待I/O,借用select内置的时间限制,来...

2020-02-02 14:21:53 286

原创 UNIX网络编程(UNP) 第十一章学习笔记

综述这一章主要探讨的问题是我们如何实现主机名-ip地址,服务名-端口号之间的转换。在IPv4的版本下,我们对应的有四个函数:1. 主机名到ip地址,gethostbyname 2. ip地址反查主机名, gethostbyaddr 3.服务名到端口号, getservbyname 4.端口号反查服务名, getservbyport上述的四个函数虽然好用,但是问题在于不兼容IPv6,于是我们引...

2019-12-28 16:16:50 425 1

原创 UNIX网络编程(UNP) 第八章学习笔记

概述可以看到udp和tcp不一样的在于,udp不需要建立连接,没有connect和listen这一步,而且使用sendto和recvfrom函数来完成基本读取recvfrom和sendto函数函数定义ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr * from,s...

2019-12-17 08:16:34 176

原创 UNIX网络编程(UNP) 第七章学习笔记

概述我们可以通过若干个方法来修改套接字的选项,包括getsockopt和setsockopt函数,fcntl函数可以用于将套接字设置为非阻塞套接字或者信号驱动套接字以及修改套接字属主的方法int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);int ge...

2019-12-16 16:33:44 217

原创 UNIX网络编程(UNP) 第六章学习笔记

第六章概述在第五章中我们看到了当客户端因为调用fgets而阻塞的时候,没有正确的处理服务器崩溃的情景,显然我们需要新的机制,允许进程获取预知能力,即在IO条件就绪(输入准备好读取,输出有足够的空间)的时候内核通知进程,从而避免进程阻塞,这种能力称之为I/O多路复用I/O多路复用的使用场景:客户处理多个描述符的时候客户同时处理多个套接字TCP服务器如果需要同时处理监听套接字又要处理连接...

2019-11-25 05:25:31 220

原创 UNIX网络编程(UNP) 第五章学习笔记

在本章中,我们将完成一个可以回射的服务器和客户端,并且我们需要理解在每一个环节可能出现什么问题,并且加以预防代码(带注释)// server#include "../unp.h"int main(int argc, char **argv){ int listenfd,connfd; pid_t child_pid; socklen_t clilen; s...

2019-11-23 09:04:18 261

原创 UNIX网络编程(UNP) 第四章学习笔记

第四章我们不妨先来看下tcp客户端/服务端程序的套接字函数我们可以看到服务端的起始到结束包含了 socket()->bind()->listen()->read()<->write()->close()而客户端则是socket()->connect()->write()<->read()->close()接下来,我们顺着这...

2019-11-22 08:17:01 372 1

原创 UNIX网络编程(UNP) 第三章学习笔记

首先我们需要了解套接字地址结构到底长啥样,我们可以在<netinet/in.h>中找到下面的结构 /* * Internet address (a structure for historical reasons) */ struct in_addr { in_addr_t s_addr; // 32位的IPV4地址,一般实现方式是uint3...

2019-11-21 04:15:10 201

原创 GO指针使用拾遗

想必大家对指针并不陌生,对于任意一个可取地址表达式(主要是变量),我们都可以用&去获取指针并传递,同时指针变量可以调用指针方法及和类型方法集,诸如此类。但是,我们有没有遇到过以下的问题在构建自己的结构体时,我应该存储的是S还是*S?为什么有些构造器,返回的是S,有些却返回的是*S?总的来说,这取决于这个结构体本身的性质,准确来说取决于这个结构体被复制的时候是安全的吗?亦或者说,...

2019-11-19 16:30:59 138

原创 GO对象对齐-怎么轻松降低内存占用

我们先看下面的代码var A = struct { oneByte byte anotherByte byte oneInt int }{}var B = struct { oneByte byte oneInt int anotherByte byte }{}看起来这两个变量包含的字段一模一样的,都是两个byte和一个int,那么他们的大小相同吗?我们不...

2019-11-14 07:46:45 304 1

原创 Unix网络编程-Mac OS环境配置

虽然网上的材料已经足够丰富了,不过似乎还是或多或少出现问题,趁着自己记忆尤新,就先记下来了~!首先如果你想跑第一个程序,你会很遗憾的发现并不能,因为缺乏作者写的头文件"dnp.h"首先我们要下载源文件https://download.csdn.net/download/ts173383201/4505201解压之后,cd 进入,并按照下面的步骤进行./configurecd li...

2019-11-09 13:28:17 265

原创 GO语言包管理速查指南

常见范式import "fmt"如果是多个package(常见)则import( "fmt" "os")怎么调用包呢?一般来说,遵循约定,比方说包路径的为"crypto/rand"的包一般调用为rand.xx但是注意的是,最终我们还是要根据源文件的package信息来决定我们的调用,比如对于import "github.com/json-iterator/go", 看起来我...

2019-10-31 08:59:27 142

空空如也

空空如也

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

TA关注的人

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