Golang网络库中socket阻塞调度源码剖析

本文分析了Golang的socket文件描述符和goroutine阻塞调度的原理。代码中大部分是Go代码,小部分是汇编代码。完整理解本文需要Go语言知识,并且用Golang写过网络程序。更重要的是,需要提前理解goroutine的调度原理。 1. TCP的连接对象: 连接对象: 在net.go中有一个名为Conn的接口,提供了对于连接的读写和其他操作: type Conn interface { Read(b []byte) (n int, err error) Write(b []byte) ...阅读全文

2015-05-14 09:41:57 华子
阅读:9088 评论:1

golang tar gzip 压缩,解压(含目录文件)

tar是用于文件归档,gzip用于压缩。仅仅用tar的话,达不到压缩的目的。我们常见的tar.gz就是用gzip压缩生成的tar归档文件。 go实现tar压缩与解压与zip类似,区别在于tar需要使用gzip进行处理。tar与zip的Header不同。代码如下 package tartest import ( "archive/tar" "compress/gzip" "io" "os" "strings" ) //压缩 使用gzip压缩成tar.gz func Compress(files [...阅读全文

2016-07-06 12:27 xiaofengshuyu
阅读:12900 评论:3

Go语言TCP网络编程(详细)

一、序言 Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,so...阅读全文

2016-12-28 17:04 hacker00011000
阅读:24401 评论:1

Go调优神器trace介绍

你想知道你的Go程序在做什么吗? go tool trace可以向你揭示:Go程序运行中的所有的运行时事件。 这种工具是Go生态系统中用于诊断性能问题时(如延迟,并行化和竞争异常)最有用的工具之一。 在我之前的博客文章中,我提到我们在Pusher中使用go tool trace来跟踪为何Go垃圾收集器有很长的停顿时间。 在这篇博文中,我更加深入的介绍go toll trace。go tool trace 试用go tool trace可以显示大量的信息,所以从哪里开始是个问题。 我们首先简要介绍...阅读全文

阅读:22520 评论:0

golang 实现 epoll 代码解析

在文章之前,我先讲个故事,我有个朋友以前是java程序员,后来转过来做go,当我问他为什么选择go的时候,他跟我说,因为写go就没人说他写的代码low了这只是个段子不要当真。。。 好回归正题 golang 的网络轮循器是如何实现的那,先说明一下 golang 的网络轮循器是做什么的,你的go程序启动的时候会创建一个M去跑我们的系统监测任务代码如下(专栏下面的所有文章都是以go 1.8版本为准): systemstack(func() { newm(sysmon, nil) })...阅读全文

阅读:8100 评论:0

[译]像牛人一样改进你的Go代码

目录 [−] gofmtgocyclointerfacerdeadcodegotypemisspellstaticcheckgosimplegoconst 原文: Lint your #golang code like a mad man!, 作者: Arsham Shirvani 我使用下面的工具来改进我的代码,除了vendor文件夹。我的操作系统是GNU/Linux,但是稍微修改一下脚本应该也能运行在你的操作系统上。我使用glide来处理依赖(vendor),但你也可以使用你的包依赖管理工具...阅读全文

2017年06月27日 smallnest
阅读:2089 评论:0

Go语言实战笔记(二十一)| Go 单元测试

《Go语言实战》读书笔记,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续笔记。觉得有帮助的话,顺手分享到朋友圈吧,感谢支持。 什么是单元测试相信我们做程序员的,对单元测试都不陌生。单元测试一般是用来测试我们的代码逻辑有没有问题,有没有按照我们期望的运行,以保证代码质量。 大多数的单元测试,都是对某一个函数方法进行测试,以尽可能的保证没有问题或者问题可被我们预知。为了达到这个目的,我们可以使用各种手段、逻辑,模拟不同的场景进...阅读全文

阅读:403 评论:0

Golang协程调度二:协程切换原理

---- *概述* ---- 协程是Golang中的轻量级线程,麻雀虽小五脏俱全,Golang管理协程时也必然会涉及到协程之间的切换:阻塞的协程被切换出去,可运行的协程被切换进来。我们在本章节就来仔细分析下协程如何切换。 *TLS* thread local storage: *getg()* goget()用来获取当前线程正在执行的协程g。该协程g被存储在TLS中。 *mcall()* mcall在golang需要进行协程切换时被调用,用来保存被切换出去协程的信息,并在当前线程的...阅读全文

2017-10-05 17:01:53 丁凯
阅读:11253 评论:0

Goroutine并发调度模型深度解析&手撸一个协程池

> 并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称原生goroutine并发成千上万不成问题,于是它也成为Gopher们经常使用的特性。 > Goroutine是优秀的,但不是完美的,...阅读全文

2018-06-28 12:06:24 panjf200
阅读:5217 评论:3

华为 深信服等研发面经

华为 深信服等研发面经本文首发于微信公众号:程序员江湖 美图面经:一面:1 Java的hashmap2 Java的多线程技术,线程池3 Java的jvm讲一下,内存模型,垃圾回收4 mysql的索引怎么建,优化5 Linux操作系统了解哪些6 网络和操作系统问了些基础7 Redis使用哪些场景8 数据结构了解哪些,排序的复杂度9 讲一下项目里的难点,说一下docker。10 其他忘记了二面:1 项目2 docker和k8s知道哪些,说一下3 OpenStack用到了哪些组件,说下4 闲聊其他5 ...阅读全文

2018.09.14 11:48 How_2_Play_Life
阅读:9455 评论:1

如何理解go语言提倡组合,不提倡继承

学习golang的过程中,有一个比较关注的价值观,golang提倡组合,不提倡继承。看过一些书和资料,感觉对这个概念的解释都不是很满意,特总结这篇文章,大家指正。 组合与继承 先说说组合与继承的概念。对设计模式有过了解的同学对这两个名词应该都有初步的理解,我们来总结一下: 官方解释就不说了,组合一般理解为 has-a 的关系,继承是is-a的关系。以java为例,组合可以理解为类里边添加的属性(一般是接口类型),继承是extends。 这里我引用一篇文章的段落浅谈组合与继承 继承的优缺点 优点:...阅读全文

2018.12.27 11:43* 刘凯_7013
阅读:3944 评论:0

使用 Prometheus 对 Go 应用程序进行监测

监测服务级别的指标能让团队成员更清晰的看到你的程序表现如何,你的程序如何被使用,并且可以帮助定位潜在的性能瓶颈。 [Prometheus](https://prometheus.io/) 是一个开源的监测解决方案,原生的服务发现支持让它成为动态环境下进行服务监测的一个完美选择。Prometheus 支持从 [AWS, Kubernetes, Consul 等](https://prometheus.io/docs/prometheus/latest/configuration/config...阅读全文

2019-01-27 13:12:39 krystollia
阅读:15571 评论:0

Mac 上 Golang 在VS Code 代码智能提示插件安装

网上通常的方法是通过安装gocode来进行代码智能提示,但是在安装过程中会遇到如下错误:“mac gocode unrecognized import path "golang.org/x/tools/go/gcexportdata"(https fetch: Get https://golang.org/x/tools/go/gcexportdata?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)”很明显是网络问题,无法访问golang.or...阅读全文

2019.03.16 19:57 _科长_
阅读:2757 评论:1

Go 语言 for 和 range 的实现

Home Menu Go 语言 for 和 range 的实现 17 Mar 2019 for range 循环 Golang Go实现原理 概述 永不停止的循环 神奇的指针 遍历清空数组 随机的遍历顺序 经典循环 范围循环 数组和切片 哈希 字符串 通道 总结 Reference 循环是几乎所有编程语言都具有的控制结构,也是编程语言中常用的控制结构,Go 语言除了使用经典的『三段式』循环之外,还引入了另一个关键字 range 帮助我们快速遍历数组、哈希表以及 Channel 等元素。 在这一节...阅读全文

2019-03-19 12:14 draveness.me
阅读:1721 评论:0