golang的http client源码简析

RT: 有注释信息的代码在:https://github.com/yuanyangen/go_learning/tree/master/src/learning 上述代码是从golang1.5.2中得到的http部分源代码 在分析该源码过程中, 得到的简易流程图是: 在上述的流程中:不同颜色的方框表示不同的协程, 上图并没有完全将所有的细节 都展示出来,只是一个最基本的功能的描述, 而方框中的文字表示该处理的代码在哪个包下面的具体函数。 对于具体的详细处理流程, 请查看源代码。 在代码中出现的部...阅读全文

2016-01-12 00:23 yuanyangen
阅读:3896 评论:1

timer在Golang中可以有多精确?

本文主要讨论timer heap在Go中的管理,以及运行时对于时间是如何获取的问题,从而引出一个结论,我们对于timer的准确度可以有多大的依赖. 首先我们看一下Go是如何获取时间的,找到time.Now,发现最终调用的是下面这个汇编函数. // func now() (sec int64, nsec int32) TEXT time·now(SB),NOSPLIT,$16 // Be careful. We're calling a function with gcc calling conv...阅读全文

阅读:1679 评论:0

Go语言如何深度拷贝对象

深度复制可以基于reflect包的反射机制完成, 但是全部重头手写的话会很繁琐. 最简单的方式是基于序列化和反序列化来实现对象的深度复制: func deepCopy(dst, src interface{}) error { var buf bytes.Buffer if err := gob.NewEncoder(&buf).Encode(src); err != nil { return err } return gob.NewDecoder(bytes.NewBuffer(buf.Byt...阅读全文

阅读:5124 评论:0

以goroutine为例看协程的相关概念

转自 http://wangzhezhe.github.io/blog/2016/02/17/golang-scheduler/ 基本上是网上相关文章的梳理,初衷主要是想了解下golang中的goroutine到底是怎么回事,以及相关的起源和概念。后来发现本质上应该是对于golang scheduler的理解,因为goroutine是golang scheduler实现的一个重要模块。这一篇入门吧,基本理解到还行,如果想深入细致了解还是应该看源码,就像参考的那些比较好的链接中的那样。 补充 同步...阅读全文

阅读:2356 评论:0

Plan9汇编语言备查

Plan9汇编语言备查 2013-02-21 本文源于对A Manual for the Plan 9 assembler的部分翻译 机器 这个汇编语言可以用于MIPS,SPARC,Intel 386,Intel 960,AMD 29000,Motorola 68020和68000, Motorola Power PC,AMD64,DEC Alpha,ARM. 寄存器 汇编语言中所有预定义的符号都是大号的.数据寄存器是R0到R7;地址寄存器是A0到A7; 浮点寄存器是F0到F7。 A6寄存器是供...阅读全文

阅读:1664 评论:0

Codebase Refactoring (with help from Go)

Codebase Refactoring (with help from Go) 代码库重构(借助于Go) 1.摘要 Go应该添加为类型创建替代等效名称的能力,以便在代码库重构期间渐进代码修复。本文解释了对于这种能力的需求,以及没有它对于今天的大型Go代码库的影响。本文还探讨了一些潜在的解决方案,包括在开发(但没有包含在)Go 1.8中提出的别名功能。然而,本文不是任何具体解决方案的提案。相反,它旨在作为Go社区讨论Go 1.9中应该包含哪些解决方案的开始。 本文是2016年11月18日在纽约G...阅读全文

2017-05-01 16:53 majianguo
阅读:829 评论:0

Go接口详解

Go接口的设计和实现是Go整个类型系统的一大特点。接口组合和嵌入、duck typing等实现了优雅的代码复用、解耦、模块化的特性,而且接口是方法动态分派、反射的实现基础(当然更基础的是编译期为运行时提供的类型信息)。理解了接口的实现之后,就不难理解"著名"的nil返回值问题以及反射、type switch、type assertion等原理。本文主要基于Go1.8.1的源码介绍接口的内部实现及其使用相关的问题。 1. 接口的实现 (1) 下面是接口在runtime中的实现,注意其中...阅读全文

阅读:1618 评论:0

进程、线程、协程与goruntine

相信作为服务端开发尤其是高性能服务开发的猿们,曾经面试都曾经被问到进程,线程之类的问题,作为操作系统最核心的概念,这些X程就像我们的一个个工具,是我们在开发过程中经常接触的概念,对于这些概念的不清晰我们便发现写的代码功能是对的,代码是渣的,将直接体现在我们代码的低效率,高bug率并附带问题出现都不知到问题出在哪里,作为新时代的猿我们原不需要那么多时间去解bug,我们需要更多时间陪女票,不是吗? 不过协程一般不会被问到,但在golang开发的过程中相信大家最经常接触的就是go协程,但对于什么...阅读全文

2017-06-05 好奇还思猫
阅读:3706 评论:2

搭建你自己的Go Runtime metrics环境

自从Go 1.5开始,每次Go release, Gopher Brian Hatfield都会将自己对新版Go的runtime的性能数据(与之前Go版本的比较)在twitter上晒出来。就连Go team staff在世界各地做speaking时也在slide中引用Brian的图片。后来,Brian Hatfield将其用于度量runtime性能数据的代码打包成library并放在github上开源了,我们也可以使用这个library来建立我们自己的Go Runtime metrics设施了。...阅读全文

阅读:353 评论:0

最佳日志实践(v2.0)

----- 0. 缘起 ----- 大约在三年前,我曾经写过一篇 最佳日志实践 ( http://link.zhihu.com/?target=http%3A//blog.jobbole.com/56574/ ) ,还被码农周刊选为那年的 最受欢迎技术干货 ( http://link.zhihu.com/?target=http%3A//oiolong.github.io/linux/2015/01/04/manong-2014-collection.html ) 之一。当时我任职于网易杭州研...阅读全文

阅读:1814 评论:0

聊一聊goroutine stack

推送在外卖订餐中扮演着重要的角色,为商家实时接单、骑手实时派单提供基础的数据通道。早期推送是由第三方服务商提供的, 随着业务复杂度的提升、订单量和用户数的持续增长,之前的系统已经远远不能满足需求,构建一个高性能、高可用的推送系统势在必行。 今年上半年我们用go开发了一个hybrid push服务,用户在线则借助长连接下发消息,不在线则借助厂商或第三方通道下发消息。 在构建过程中遇到了些与 goroutine stack 相关的问题,这里就和大家扯一扯。 带着问题阅读,才能让阅读更加高效,首先让我...阅读全文

2017-07-29 00:00 coding & life
阅读:1224 评论:5

调试Go语言的核心转储(Core Dumps)

翻译原文链接 转帖/转载请注明出处 英文原文链接【Go, the unwritten parts】 发表于2017/05/22 作者JBD是Go语言开发小组成员 检查程序的执行路径和当前状态是非常有用的调试手段。核心文件(core file)包含了一个运行进程的内存转储和状态。它主要是用来作为事后调试程序用的。它也可以被用来查看一个运行中的程序的状态。这两个使用场景使调试文件转储成为一个非常好的诊断手段。我们可以用这个方法来做事后诊断和分析线上的服务(production services)。 ...阅读全文

2017-08-22 09:04:58 曼托斯
阅读:632 评论:0

快速掌握 Golang context 包,简单示例

预览目录 Context 原理 遵循规则 Context 包 WithCancel 例子 WithDeadline 例子 WithTimeout 例子 WithValue 例子 参考连接 对于 Golang 开发者来说context(上下文)包一定不会陌生。但很多时候,我们懒惰的只是见过它,或能起到什么作用,并不会去深究它。 应用场景:在 Go http 包的 Server 中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比...阅读全文

2017-08-28 01:52 Deepzz's Blog
阅读:1367 评论:0

Go 程序的性能优化及 pprof 的使用

Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化。对于服务器而言,最重要的两项资源莫过于 CPU 和内存。性能优化,就是在对于不影响程序数据处理能力的情况下,我们通常要求程序的 CPU 的内存占用尽量低。反过来说,也就是当程序 CPU 和内存占用不变的情况下,尽量地提高程序的数据处理能力或者说是吞吐量。 Go 的原生工具链中提供了非常多丰富的工具供开发者使用,其中包括 pprof。 对于 pprof 的使用要分成下面两部分来说。 Web 程序使用 pprof...阅读全文

2017-08-21 10:51 snowInPluto
阅读:1310 评论:1

如何把Go调用C的性能提升10倍?

目前,当Go需要和C/C++代码集成的时候,大家最先想到的肯定是CGO。毕竟是官方的解决方案,而且简单。 但是CGO是非常慢的。因为CGO其实一个桥接器,通过自动生成代码,CGO在保留了C/C++运行时的情况下,搭建了一个桥来沟通C/C++世界和Go的世界。这就意味着,兼容性很好,但是对C的函数的调用,必须先把当前的goroutine挂起,并切换执行栈到当前的线程M的主栈(大小2MB)。如果不做这个操作,那么只能在goroutine的栈上执行C函数调用,可是,goroutine的栈一般都很小,很...阅读全文

2017-09-07 09:27:56 LinkerLin
阅读:1176 评论:3

使用 pprof 和火焰图调试 golang 应用

什么是 Profiling? Profiling 这个词比较难翻译,一般译成画像。比如在案件侦破的时候会对嫌疑人做画像,从犯罪现场的种种证据,找到嫌疑人的各种特征,方便对嫌疑人进行排查;还有就是互联网公司会对用户信息做画像,通过了解用户各个属性(年龄、性别、消费能力等),方便为用户推荐内容或者广告。 在计算机性能调试领域里,profiling 就是对应用的画像,这里画像就是应用使用 CPU 和内存的情况。也就是说应用使用了多少 CPU 资源?都是哪些部分在使用?每个函数使用的比例是多少?有哪些函...阅读全文

2017-09-12 12:02 CIZIXS
阅读:633 评论:0

我对Go语言的错误处理有哪些不满,以及我是如何处理的

写 Go 的人往往对它的错误处理模式有一定的看法。按不同的语言经验,人们可能有不同的习惯处理方法。这就是为什么我决定要写这篇文章,尽管有点固执己见,但我认为听取我的经验是有用的。我想要讲的主要问题是,很难去强制执行良好的错误处理实践,错误经常没有堆栈追踪,并且错误处理本身太冗长。不过,我已经看到了一些潜在的解决方案,或许能帮助解决一些问题。 与其他语言的快速比较 在 Go 中,所有的错误都是值。因为这点,相当多的函数最后会返回一个 error, 看起来像这样: func (s *SomeStru...阅读全文

2017-09-22 15:25 Andrew Morgan
阅读:1857 评论:6

内网穿透工具的原理与开发实战

-- 前言 -- 在我国,由于网民众多,运营商无法保证为每一个宽带用户提供全球唯一的公网IPv4地址。因此很多用户会发现通过路由器端查看到的WAN端IP与百度“IP”关键词所得到的IP不一致,并且前者的IP为一个私有IP。 而还有一些情况下,公网IP比较昂贵,企业虽然本身也持有少量的独立的公网IP,但是由于成本限制无法为企业内每一台主机都提供一个公网IP,或者内网并不是所有服务都需要暴露到公网中进行访问,那么企业有可能就会使用NAT技术将大量的内网IP通过一定规则映射到公网IP上。而最常见的...阅读全文

2017-10-23 16:31:06 昌维
阅读:2007 评论:1

Go 终极指南:编写一个 Go 工具

我之前编写过一个叫 **gomodifytags** 的工具,它使我的生活变得很轻松。它会根据字段名称自动填充结构体标签字段。让我来展示一下它的功能: ![在 vim-go 中使用 gomodifytags 的一个示例](http://upload-images.jianshu.io/upload_images/2192094-880be71ebd4d9610.gif?imageMogr2/auto-orient/strip) 使用这样的工具可以很**容易管理**结构体的多个字段。该...阅读全文

2017-10-27 09:53:11 oopsguy
阅读:2724 评论:7

Golang源码探索(二) 协程的实现原理

Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理. 这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit. 核心概念 要理解协程的实现, 首先需要了解go中的三个...阅读全文

阅读:3491 评论:0