golang的http client源码简析

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

2016-01-12 00:23 yuanyangen
阅读:9363 评论:2

go 类型系统(二)

pre-declared type (预声明类型) golang 默认的有几个预声明类型:boole,num,string type. 这些预声明类型被用来构造其他的类型。 type literal(字面量类型) 由其他预声明类型组合而成(没有使用type 关键字定义),array,struct,pointer,slice,map,channel,function,interface [2]int ,[ ] int , chan int , map[string] string ,* int 注...阅读全文

阅读:2541 评论:0

Go HTTP请求处理——net/http包

Go 语言中处理 HTTP 请求主要跟两个东西相关:ServeMux 和 Handler。 一、ServeMux 和 Handler ServrMux 本质上是一个 HTTP 请求路由器(或者叫多路复用器,Multiplexor),它把收到的请求与一组预先定义的 URL 路径列表做对比,然后在匹配到路径的时候调用关联的处理器(Handler)。 Handler(处理器)负责输出HTTP响应的头和正文,任何满足了http.Handler接口的对象都可作为一个处理器。通俗的说,对象只要有个如下签名的...阅读全文

2016-12-12 21:00:04 吃一堑消化不良
阅读:12423 评论:1

fasthttp中的协程池实现

fasthttp中的协程池实现 协程池可以控制并行度,复用协程。fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池。实现并不复杂,我们可以参考他的设计,写出高性能的应用。 入口 // server.go func (s *Server) Serve(ln net.Listener) error { var lastOverflowErrorTime time.Time var lastPerIPErrorTime time.Time var c net.Conn v...阅读全文

2017-04-20 15:01:26 一堆好人卡
阅读:4280 评论:0

golang 内存分析/动态追踪

golang pprof 当你的golang程序在运行过程中消耗了超出你理解的内存时,你就需要搞明白,到底是 程序中哪些代码导致了这些内存消耗。此时golang编译好的程序对你来说是个黑盒,该 如何搞清其中的内存使用呢?幸好golang已经内置了一些机制来帮助我们进行分析和追 踪。 此时,通常我们可以采用golang的pprof来帮助我们分析golang进程的内存使用。 pprof 实例 通常我们采用http api来将pprof信息暴露出来以供分析,我们可以采用net/http/pprof 这...阅读全文

阅读:14973 评论:0

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

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

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

调度器学习

概要 本文从几个角度入手,描述和学习调度器原理 讲解调度器的基本概念 go语言的作者实现的C的协程库 libtask 源码分析,以理解协程的原理 golang的调度器原理 任务调度概念 任务与任务控制块(TCB) linux中称为进程控制块(PCB),即包含任务相关的数据结构,包含任务执行过程中的所有信息。 任务的名字 task name 任务的ID task id 任务的状态 task status 任务的优先级 task priority 任务的上下文(寄存器、堆栈指针、程序计数器(PC) ...阅读全文

2017.09.27 15:40 zengfan
阅读:1349 评论:5

Go 语言函数众生相

### 本文是对匿名函数、高阶函数、闭包、同步、延时(defer)及其他 Go 函数类型或特性的概览。 ![The Zoo of Go Funcs](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-functions-overview/The_zoo_of_go_funcs.png) > *这篇文章是针对 Go 语言中不同的函数类型或特性的摘要总结。* > > *更为深入的探讨我会在近期的文章...阅读全文

2017-12-05 17:55:45 shockw4ver
阅读:3448 评论:2

Golang网络:核心API实现剖析(一)

这一章节我们将详细描述网络关键API的实现,主要包括Listen、Accept、Read、Write等。 另外,为了突出关键流程,我们选择忽略所有的错误。这样可以使得代码看起来更为简单。 而且我们只关注tcp协议实现,udp和unix socket不是我们关心的。 -------- *Listen* -------- func Listen(net, laddr string) (Listener, error) { la, err := resolveAddr("listen", net,...阅读全文

2017-12-03 10:32:03 丁凯
阅读:3627 评论:0

图解 Go 中的延迟调用 defer

> 本教程将通过几个实用的例子讲解 Go 语言中的 **defer** 的用法 ## 什么是 defer ? 通过使用 `defer` 修饰一个函数,使其在外部函数 ["返回后"](https://medium.com/@inanc/yeah-semantically-after-is-the-right-word-fad1d5181891) 才被执行,即便外部的函数返回的是 [panic 异常](https://golang.org/ref/spec#Handling_panics...阅读全文

阅读:4604 评论:7

如何优雅的关闭Go Channel【译】

*Channel关闭原则* 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作。 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费者已经没有值可以继续读了。只要坚持这个原则,就可以确保向一个已经关闭的channel发送数据的情况不可能发生。 *暴力关闭channel的正确方法* 如果想要在消费端关闭channel,或者在多个生产者端关闭channel,可以使用recover机制来上个保险,避免程序因为panic而崩...阅读全文

阅读:1474 评论:1

golang的httpserver优雅重启

去年在做golangserver的时候,内部比较头疼的就是在线服务发布的时候,大量用户的请求在发布时候会被重连,在那时候也想了n多的方法,最后还是落在一个github上的项目,facebook的一个golang项目grace,那时候简单研究测试了一下可以就直接在内部使用了起来,这段时间突然想起来,又想仔细研究一下这个项目了。 从原理上来说是这样一个过程: 1)发布新的bin文件去覆盖老的bin文件 2)发送一个信号量,告诉正在运行的进程,进行重启 3)正在运行的进程收到信号后,会以子进程的方式启...阅读全文

阅读:2559 评论:0

[Golang软件推荐] Golang通用连接池

连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrift-Clinet链接Service端使用的时候出现了并发问题,然后找到了一个通用的连接池的库在这里分享给大家. 附上: 喵了个咪的博客:w-blog.cn go-commons-pool-Github地址:github.com/jolestar/go-commons-pool 1.连接池 在使用之前我们需要先了解清楚连接池的概念,总结下来...阅读全文

2018-03-10 12:33:08 喵了_个咪
阅读:3088 评论:0

Golang interface接口全面理解(一)

There are three kinds of time: the future is late, and now it is flying like an arrow. The past will never stand still. 时间的步伐有三种:未来姗姗来迟,现在像箭一般飞逝,过去永远静立不动。 什么是interface 在面向对象编程中,可以这么说:“接口定义了对象的行为”, 那么具体的实现行为就取决于对象了。 在Go中,接口是一组方法签名。当一个类型为接口中的所有方法提供定义时,...阅读全文

2018-03-12 15:33:08 90design
阅读:38954 评论:5

聊一聊,Golang “相对”路径问题

前言 Golang 中存在各种运行方式,如何正确的引用文件路径成为一个值得商议的问题 以 gin-blog 为例,当我们在项目根目录下,执行 go run main.go 时能够正常运行(go build也是正常的) [$ gin-blog]# go run main.go [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_M...阅读全文

2018-03-13 00:34:39 煎鱼
阅读:21072 评论:0

你所不知道的 Go 语言的一些令人惊叹的优点

![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-advantage/1.png) > 插图来自 https://github.com/ashleymcnamara/gophers 在这篇文章中,我将会讨论为什么你应该尝试下 Go 语言,并且应该从哪里开始下手。 Golang 是一种编程语言,在过去的几年中你可能听说过很多。尽管是在 2009 年创建的,但是近年来才开始流行。 ![]...阅读全文

2018-03-13 10:06:01 huangjian
阅读:4278 评论:0

Go Context的踩坑经历

0 引言context是Go中广泛使用的程序包,由Google官方开发,在1.7版本引入。它用来简化在多个go routine传递上下文数据、(手动/超时)中止routine树等操作,比如,官方http包使用context传递请求的上下文数据,gRpc使用context来终止某个请求产生的routine树。由于它使用简单,现在基本成了编写go基础库的通用规范。笔者在使用context上有一些经验,遂分享下。本文主要谈谈以下几个方面的内容:context的使用。context实现原理,哪些是需要注...阅读全文

2019-08-24 17:47:06 包增辉
阅读:32640 评论:4

golang技巧-接口型函数

接口型函数:指的是用函数实现接口,这样在调用的时候就会非常简便,这种函数为接口型函数,这种方式适用于只有一个函数的接口。 定义一个类型,这个类型只定义了函数的参数列表,函数参数列表与接口定义的方法一致: type HandlerFunc func(k, v interface{}) 然后这个类型去实现接口,实现的函数调用自己 func (hf HandlerFunc) Do(k, v interface{}) { hf(k, v) // 接口的实现中调用本身。这样就使得可以用函数来实现接口功能,...阅读全文

阅读:2177 评论:0

Golang,kafka实现消息推拉

Kafka的安装与启动 kafka中涉及的名词 消息记录:由一个key,一个value和一个时间戳构成,消息最终存储在主题下的分区中,记录在生产中称为生产者记录,在消费者中称为消费记录。Kafka集群保持了所有发布的消息,直到它们过期,无论消息是否被消费了,在一个可配置的时间段内,Kafka集群保留了所有发布的消息。比如消息的保存策略被设置为2天,那么在一个消息被发布的两天时间内,它都是可以被消费的。Kafka的性能是和数据量无关的常量级的,所以保留太多数据并不是问题 生成者:生产者用于发布消息...阅读全文

阅读:16391 评论:1

再读Golang中的异常处理

一起重温Golang中的异常处理啊???? 1.Golang语言中没有其他语言中的try...catch...语句来捕获异常和异常恢复 2.在Golang中我们通常会使用panic关键字来抛出异常,在defer中使用recover来捕获异常进行具体逻辑处理 3.Golang中我们通常会在函数或方法中返回error结构对象来判断是否有异常出现 注意事项 1.利用recover和panic指令,defer必须放在panic之前定义(panic会终止其后要执行的代码). 2.recover只有在def...阅读全文

2019.10.20 20:54:35 aside section . 等
阅读:1737 评论:0