
Go语言高级进阶篇
文章平均质量分 78
Go语言核心之美等国外优秀文章翻译!
孙飞 Sunface
一枚略懂Rust的全栈程序员,喜欢写作&编程
展开
-
为Go语言GC正名-20秒到100微妙的演变史
原文链接:https://blog.twitch.tv/gos-march-to-low-latency-gc-a6fa96f06eb7#.lrmfby2xs 下面我们会介绍https://www.twitch.tv视频直播网站在使用Go过程中的GC耗时演变史。 我们是视频直播系统且拥有数百万的在线用户,消息和聊天系统全部是用Go写的,该服务单台机器同时连接了50万左右的用户。在Go1.4到1.原创 2016-07-07 17:09:17 · 30891 阅读 · 10 评论 -
听说,你想让自己的Go程序运行的更快?
到现在为止,我已经忘记了我在写什么,但我确定这篇文章是关于Go语言的。这主要是一篇,关于运行速度,而不是开发速度的文章——这两种速度是有区别的。 我曾经和很多聪明的人一起工作。我们很多人都对性能问题很痴迷,我们之前所做的是尝试逼近能够预期的(性能)的极限。应用引擎有一些非常严格的性能要求,所以我们才会做出改变。自从使用了Go语言之后,我们已经学习到了很多提升性能以及让Go在系统编程中正常运转的方法原创 2016-04-22 15:07:57 · 9579 阅读 · 5 评论 -
让vscode完美支持go vendor的代码跳转(使用vscode必看)
使用vscode作为Go的IDE是一件非常爽的事情。 可是事情总有不完美。现在有很多项目都是用vendor来做第三方包的版本控制,可是godef竟然不支持vendor的代码跳转!!我们想跳转到vendor中的代码,目前是无法做到的。 现在特分享一个自修改的版本,完美支持vendor特性,只要go install后,就可以爽爽的用vscode了。 欢迎大家加入Golang隐修会,群号894864,在原创 2016-04-16 23:44:21 · 43459 阅读 · 4 评论 -
一个简单的例子阐述Go的对象复用思想
本来想写一个例子来给团队的人阐述一下Go中的对象复用思想,写完后发现这种思想也许某些同学还不知道,现分享出来// Go中为了减少海量的内存分配,控制垃圾回收时间,对于热点数据采用池的思想去处理是// 非常棒的,下面的例子就是一个简单的tcp读取缓存池复用// 实现了一个读取tcp长连接的buffer池,每次读取一条新连接时,先去池里读取// 如果不存在,则创建新的// 注意buf在原创 2016-04-14 17:40:18 · 11338 阅读 · 0 评论 -
Go语言核心之美 4.3-多返回值
在Go语言中,函数可以有多个返回值,这个特性我们已经在之前的例子见过很多,很多标准库函数都会返回两个值,一个是期望得到的函数执行结果,另外一个是函数出错时的错误值。 下面的程序是findlinks的改进版本,它可以自己发起HTTP请求,这样就不必再运行fetch。因为HTTP请求和解析操作都可能会失败,因此findlinks声明了两个返回值:存储链接的列表和错误值。一般而言,HTML的解析器当遇到原创 2016-04-05 19:29:23 · 11482 阅读 · 0 评论 -
Go语言核心之美 4.2-递归函数
函数是可以递归调用的,这意味着函数可以直接或者间接调用它自身。对于许多问题而言,递归是一种非常有用的技术,例如处理递归的数据结构(树形结构),在3.4节中,我们通过遍历二叉树来实现简单的插入排序,在本节中,将再次用这种技术来处理HTML文件。 下面的示例代码中使用了非标准包golang.org/x/net/html来解析HTML。golang.org/x/...目录下存放了一些由Go语言开发团队设原创 2016-04-05 18:57:23 · 6759 阅读 · 0 评论 -
Go语言核心之美 4.1-函数声明
函数有以下几个优点:可以让把一系列语句打包成一个程序单元;可以把大的工作分解为小的任务,这些任务可以让不同程序员在不同时间、不同地点独立完成;一个函数可以对用户隐藏实现细节。这些优点,让函数变成了程序不可或缺的最重要的一部分。 在此章之前,我们已经见过很多函数了,现在是时候彻底讨论函数的特性了。本章用的例子是一个网络爬虫,也是web搜索引擎中负责抓取网页的组件,他们会根据抓取到的网页中的链接继续去原创 2016-04-05 18:11:05 · 5120 阅读 · 0 评论 -
Go语言核心之美 3.6-template模版
上一节的例子中使用了Printf做了输出格式化,当然,对于简单的例子来说足够了,但是我们有时候还是需要复杂的输出格式,甚至需要将格式化代码分离开来。这时,可以使用text/template和html/template。 一个模版就是一个字符串或者一个文件,里面包含了一个或多个{{..}}形式的对象,这种对象被称为模版的actions。除了actions外,模版的其它部分就按字面值打印,但是对于ac原创 2016-04-05 17:08:23 · 9298 阅读 · 0 评论 -
Go语言核心之美 3.5-JSON
JSON(JavaScript Object Notation)是一种发送和接收结构化信息的标准化表示法。类似的标准化协议还有XML、ASN.1、Protobuf、Thrift等等,这些协议都有自己的鲜明特色,但是由于JSON的简洁、可读、流行性,因此它是应用最广泛的协议之一。 Go语言对上述协议的编码和解码都有很好的支持,例如标准库中的encoding/json、encoding/xml、enc原创 2016-04-05 13:04:29 · 8671 阅读 · 0 评论 -
Go语言核心之美 3.4-Struct结构体
struct结构体也是一种聚合的数据类型,结构体中可以有零个或多个任意类型的值-结构体的成员。用来演示struct的一个经典案例就是公司的员工信息,每条员工信息都包含:员工编号,姓名,住址,出生日期,工作岗位,薪资,直属领导等。所有的信息都可以存在一个struct中,该struct可以作为完整的单元可以被复制,或者作为函数的参数、返回值,或者被存到数组、切片中,等等。 下面声明了Employee原创 2016-03-25 17:46:56 · 21169 阅读 · 3 评论 -
Go语言核心之美 3.3-Map
哈希表是一种非常好用、适用很广的数据结构,它是key-value对的无序集合,其中key是唯一的,通过key可以在常数复杂度时间内进行查询、更新或删除,无论表有多大。 Go语言的map就是对哈希表的引用,表示为map[Key]Value。map中所有的key都是相同的类型,所有的value也是相同的类型,不过key和value可以是不同的类型。能做key的数据类型,必须支持==和!=运算符,这样m原创 2016-03-23 18:50:55 · 4376 阅读 · 3 评论 -
Go语言核心之美 3.2-slice切片
Slice是长度可变的元素序列(数组不可变),每个元素都有相同的类型。slice类型写作[]T,其中T代表slice中的元素类型;slice和数组写法很像,只是没有指定长度。 数组和slice之间的联系非常紧密。slice是非常轻量的数据结构,它是引用类型,指向底层的一个数组,该数组被称之为slice的底层数组,slice可以访问底层数组的某个子序列,也可以访问整个数组。一个slice由三个部分组原创 2016-03-23 13:21:52 · 6821 阅读 · 3 评论 -
Go语言核心之美 3.1-数组
上一章中深入学习了基本数据类型,它们是构建复杂数据类型的基础,是Go语言世界中的原子。本章,我们将学习复合类型:通过不同的方式将基本类型组合起来。主要有四种复合类型--数组,切片(slice),map,结构体(struct),在本章末尾,我们将展示如何通过struct来进行JSON编解码,同时配合template模板来生成HTML页面。 数组和结构体都是聚合类型:数组是由元素组成,结构体由字段组成原创 2016-03-22 17:42:45 · 3545 阅读 · 0 评论 -
Go语言核心之美 2.5-字符串
字符串是不可变的字节序列,可以包含任意数据,包括0这个字节,不过通常是用来包含可读性较强的文本。文本字符串通常采用UTF-8编码,由Unicode码点(rune)组成。 内置的len函数会返回字符串的所有字节数(注意不是rune的数目!!一个rune可能包含多个字节),下标操作s[i]可以获取字符串的第i 个字节(从0开始), 其中i >= 0 && i s := "hello, world"原创 2016-03-17 18:06:20 · 8784 阅读 · 2 评论 -
Go语言核心之美 2.4-布尔值
布尔值有两种:true和false。if和for语句中的条件都是布尔值,比较运算符== 、 布尔值可以结合&&(AND) 、|| (OR)一起使用,这两个操作符都有短路特性,如果操作符的左边表达式就能决定结果了,那操作符右边的表达式不会求值:s != "" && s[0] == 'x' 如果s是空字符串,那s[0]会panic,但是因为s为""的时候,&&左边的表达式是false,因此根据短路规则原创 2016-03-16 18:32:01 · 5204 阅读 · 0 评论 -
Go语言核心之美 2.3-复数
Go提供了两种size的复数类型:complex64和complex128,分别由float32和float64组成。内置函数complex从实部和虚部构建复数,内置函数real和imag用来获取复数的实部和虚部:var x complex128 = complex(1, 2) // 1+2ivar y complex128 = complex(3, 4) // 3+4ifmt.Println原创 2016-03-16 17:50:33 · 6155 阅读 · 1 评论 -
Go语言核心之美 2.2-浮点数
Go提供了两种size的浮点数,float32和float64。它们的算术规范是由IEEE754国际标准定义,现代CPU都实现了这个规范。 浮点数能够表示的范围可以从很小到很巨大,浮点数的取值范围可以在math包中获取,math.MaxFloat32表示float32的最大值,大约是3.4e38,math.MaxFloat64大概是1.8e308。两个类型最小的非负值大概是1.4e-45和4.9e原创 2016-03-16 16:51:53 · 8698 阅读 · 1 评论 -
Go语言核心之美 2.1-整数
第二章 序 在计算机底层,一切都是比特位。然而计算机一般都操作固定大小的数,称之为字(word)。字会被解释为整数、浮点数、比特位数组、内存地址等,这些字又可以进一步聚合成数据包(packet)、像素点、作品集、是个或者其它任何对象。Go语言提供了多样化的数据组织方式,这些数据类型能提供硬件层面的兼容性,也能让程序员方便的组合成更复杂的数据类型。 Go语言的数据类型分为四大类:基本类型,复合类型原创 2016-03-16 13:44:02 · 6320 阅读 · 0 评论 -
Go语言核心之美 1.5-作用域
变量的作用域是指程序代码中可以有效使用这个变量的范围。不要将作用域和生命期混在一起。作用域是代码中的一块区域,是一个编译期的属性;生命期是程序运行期间变量存活的时间段,在此时间段内,变量可以被程序的其它部分所引用,是运行期的概念。 语法块是包含在花括号内的一系列语句,例如函数体或者循环体。语法块内部声明的变量是无法被语法块外部代码访问的。我们可以扩展局部语法块的概念,在某些场景下,是不需要花括号的原创 2016-03-15 20:59:30 · 4780 阅读 · 0 评论 -
Go语言核心之美 1.4-包和文件
Go语言中的包(Package)就像其它语言的库(Library)或模块(Module)一样,支持模块化,封装性,可重用性,单独编译等特点。包的源码是由数个.go文件组成,这些文件所在的目录名是import路径的最后一个词,例如github.com/sunface/corego包的所有文件都存储在$GOPATH/src/github.com/sunface/corego底下。 每个包都有独立的命名原创 2016-03-15 17:39:02 · 4368 阅读 · 0 评论 -
Go语言核心之美 1.3-赋值及类型声明篇
四、赋值(Assignment) 变量的值可以通过赋值操作来更新, v = 10。x = 1 // 具名变量x*p = true // 指针变量person.name = "bob" // 结构体struct的字段count[x] = count[x] * scale // 数组、切片或者map的原创 2016-03-15 13:16:54 · 3996 阅读 · 0 评论 -
Go语言核心之美 1.2-变量及声明篇
三.变量 1.用var关键字可以创建一个指定类型的变量。 var i int = 0 var i = 0 var i int 以上三个表达式都是合法的,其中第三个表达式会初始化i为int的零值;如果是bool类型,则为false;float64是0.0;string为"";interface为nil;引用类型也为nil;如果是struct,则是将struct的所有字段初始化为对应类型的零值原创 2016-03-14 21:37:12 · 3887 阅读 · 3 评论 -
Go语言核心之美 1.1-命名篇
一.命名篇 1.Go的函数、变量、常量、自定义类型、包(Package)的命名方式遵循以下规则: 1)首字符可以是任意的Unicode字符或者下划线 2)剩余字符可以是Unicode字符、下划线、数字 3)字符长度不限 2.Go只有25个关键字 break default func interface selectcase原创 2016-03-14 13:28:04 · 8204 阅读 · 0 评论 -
Go语言核心之美-必读
Go语言核心技术系列文章都是我原创、或从国外的书籍和博客中收集优秀的文章进行翻译的,因此转载时请注明转载出处,不胜感激。 欢迎大家加入Go语言核心技术QQ群894864,里面热心大神很多哦!原创 2016-03-14 13:34:45 · 5681 阅读 · 1 评论 -
Golang和Erlang消息传递机制对比
上一篇文章介绍了 Go 和 Erlang 在调度器的实现,本文将简要介绍这两种并发语言的消息传递机制简要对比Erlang和Go虽然在实现及功能上差异较大,但是都支持高并发的轻量级用户任务(Erlang的轻量进程,Go的Goroutine), 并且都采用了消息传递的方式作为任务间交互的方式。在Erlang中,采用了一种比较纯粹的消息传递机制,进程间几乎没有任何形式的数据共享,只能通过彼此间发送消息进转载 2015-12-11 15:25:22 · 5995 阅读 · 1 评论 -
Golang和Erlang的IO调度浅析
之前关于调度器的对比分析的文章,在结束时遗留了一些问题:当系统出现高并发的IO访问时,如一个网络服务器通常要并发处理成百上千的链接,每个链接可能都是由一个用户任务执行的,那么将会出现大量阻塞的IO操作,如果为每个阻塞操作都单独分配一个OS线程,那么系统很容易就会退化成多OS线程的系统,轻量任务的优势将无从谈起。本文试图回答这个问题,通过分析Go和Erlang对于IO、特别是网络IO的优化机制,了解转载 2015-12-11 15:24:17 · 3499 阅读 · 0 评论 -
[Golang]设计模式实践:组合(Composite)
关于本系列这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档、图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代码自己琢磨,所以我特别想在这方面有一些收集和总结。然后这个系列也是关于设计模式的。虽然Go语言不是一门面向对象编程语言,但是很多面向对象设计模式所要解决的问题是在程序设计中客观存在的。不管用什么语言原创 2015-03-11 10:42:25 · 6201 阅读 · 6 评论 -
Golang和Erlang的并发调度浅析
Go 语言和 Erlang 都是面向并发应用的语言,都采用轻量级线程和消息传递模型。尽管Go在语法上也支持共享,但必须以通信的方式同步方能保证其正确性。Erlang则是完全不支持进程间的共享,状态信息完全需要依靠消息彼此传递。从底层来看,在 Google 官方编译器中,Go 语言的 Goroutine 是一种类似协程的结构,由于采用了定制的C编译器来构建,因此其上下文切换的效率要高于C库的 cor转载 2015-12-11 15:23:06 · 7036 阅读 · 0 评论 -
[Golang]OS系统调用浅析
上回讲Goroutine状态变换的时候,遗留了一部分关于Syscall处理的内容,这次打算把Go语言对Syscall的处理机制系统的总结一下,放在今天这篇文章中。Go 语言库对Syscall的封装我们知道Go是一门面向系统级开发的Native编程语言,与C/C++ 类似,Go的编译器会直接将程序编译、链接成本地可执行文件。理论上,它可以完成任何C/C++语言能完成的。作为支撑该特性的重要方面,Go转载 2015-12-11 15:26:32 · 8278 阅读 · 0 评论