使用 Go 语言实现优雅的服务器重启

Go被设计为一种后台语言,它通常也被用于后端程序中。服务端程序是GO语言最常见的软件产品。在这我要解决的问题是:如何干净利落地升级正在运行的服务端程序。 目标: 不关闭现有连接:例如我们不希望关掉已部署的运行中的程序。但又想不受限制地随时升级服务。 socket连接要随时响应用户请求:任何时刻socket的关闭可能使用户返回'连接被拒绝'的消息,而这是不可取的。 新的进程要能够启动并替换掉旧的。 ...阅读全文

2014-12-20 09:00:00 pseudo, Garfiel 等
阅读:16247 评论:3

【玩转Golang】slice切片的操作——切片的追加、删除、插入等

一、一般操作 1,声明变量,go自动初始化为nil,长度:0,地址:0,nil func main(){ var ss []string; fmt.Printf("length:%v \taddr:%p \tisnil:%v",len(ss),ss, ss==nil) } --- Running... length:0 addr:0x0 isnil:true Success: process exited with code 0. 2,切片的追加,删除,插入操作 func main(){ var...阅读全文

2015-01-20 06:13 dajianshi
阅读:88472 评论:8

golang中net包用法(一)

net包对于网络I/O提供了便携式接口,包括TCP/IP,UDP,域名解析以及Unix Socket。尽管net包提供了大量访问底层的接口,但是大多数情况下,客户端仅仅只需要最基本的接口,例如Dial,LIsten,Accepte以及分配的conn连接和listener接口。 crypto/tls包使用相同的接口以及类似的Dial和Listen函数。下面对net包进行具体分析。 首先介绍其中常量: const ( IPv4len = 4 IPv6len = 16 ) 很容易看出这表示ip地址的长...阅读全文

2015-01-16 20:30 chenbaoke
阅读:12354 评论:0

[golang note] 网络编程 - RPC编程

net包 • 官方文档 http://godoc.golangtc.com/pkg/net/ Package net provides a portable interface for network I/O, including TCP/IP, UDP, domain name resolution, and Unix domain sockets. net包中提供了一系列可移植的网络I/O接口,其中包含了TCP/IP、UDP、域名解析和Unix域套接字。 RPC • RPC定义 RPC,Re...阅读全文

2016-05-27 16:22 heartchord
阅读:2825 评论:0

Go语言内幕(1):主要概念与项目结构

本文由 伯乐在线 - yhx 翻译,唐尤华 校稿。未经许可,禁止转载!英文出处:Sergey Matyukevich。欢迎加入翻译组。这个系列博客主要为那些对 Go 基本知识已经有一定了解,又希望对其内部细节进行更深一步地探索的人准备的。今天这一篇主要分析 Go 源代码的基本结构以及 Go 编译器的某些内部细节。读完这篇博客后,你会得到下面三个问题的答案: 1. Go 源代码结构是什么样子的? 2. Go 编译器是如何工作的? 3. Go 语言中的结点树的基本结构是什么样的? 让我们开始吧 每当...阅读全文

阅读:8441 评论:1

Go语言内幕(2):深入 Go 编译器

本文由 伯乐在线 - yhx 翻译,jasper 校稿。未经许可,禁止转载!英文出处:Sergey Matyukevich。欢迎加入翻译组。当你通过接口引用使用一个变量时,你知道 Go 运行时到底做了哪些工作吗?这个问题并不容易回答。这是因为在 Go 中,一个类型实现了一个接口,但是这个类型并没有包含任何对这个接口的引用。与上一篇博客《Go语言内幕(1):主要概念与项目结构》一样,你可以用 Go 编译器的知识来回答这个问题。关于 Go 编译器的内容我们已经在上一篇中已经讨论过一部分了。 在这里,...阅读全文

阅读:5258 评论:2

Go语言内幕(3):链接器、链接器、重定位

本文由 伯乐在线 - yhx 翻译,黄利民 校稿。未经许可,禁止转载!英文出处:Sergey Matyukevich。欢迎加入翻译组。 《Go语言内幕(1):主要概念与项目结构》 《Go语言内幕(2):深入 Go 编译器》 本文将会讨论关于 Go 链接器、目标文件(object file)以及重定位(relocation)相关的内容。 为什么要关注这些东西呢?如果你想学习任何一个大项目的内部机制,那么你首先要做的一件事就是学会将其分割成不同的部件或者模块。接下来,你需要搞懂这些模块向外提供的接口...阅读全文

阅读:4832 评论:0

golang中的格式化输入输出

【简介】 fmt 包实现了格式化 I/O 函数,类似于 C 的 printf 和 scanf。格式“占位符”衍生自 C,但比 C 更简单。 【打印】 占位符: [一般] %v 相应值的默认格式。在打印结构体时,“加号”标记(%+v)会添加字段名 %#v 相应值的 Go 语法表示 %T 相应值的类型的 Go 语法表示 %% 字面上的百分号,并非值的占位符 [布尔] %t 单词 true 或 false。 [整数] %b 二进制表示 %c 相应 Unicode 码点所表示的字符 %d 十进制表示 %...阅读全文

阅读:10704 评论:0

垃圾回收面面观

垃圾回收面面观 2015-06-18 下一篇准备写Go1.5的垃圾回收的,所以这一篇先做一些垃圾回收相关的基础知识的铺垫。 基本垃圾回收算法 实际上大多数的垃圾回收算法,都是下面三种基本垃圾回收算法之上的变种。 引用计数(reference counting) 基本思路是为每个对象加一个计数器,记录指向这个对象的引用数量。每次有一个新的引用指向这个对象,计数器加一;反之每次有一个指向这个对象引用被置空或者指向其他对象,计数器减一。当计数器变为 0 的时候,自动删除这个对象。 引用计数的优点是: ...阅读全文

阅读:2007 评论:0

剖析使Go语言高效的5个特性(2/5): 函数调用不是免费的

翻译原文链接 转帖/转载请注明出处 英文原文链接 发表于2014/06/07 函数调用不是免费的 一个函数调用有三个步骤。创建一个新的堆栈框(stack frame)并把调用者的详细信息记录下来。把任何会被被调用函数用到的寄存器内容保存到堆栈。计算被调用函数的地址,并执行跳转指令到那个新的地址。 因为函数调用是频繁操作,CPU的设计者花费了很多精力来优化这个过程,但他们不可能消除所有的开销。 根据被调用函数的功能,这个调用开销可能是可以忽略不计的,也可能是非常显著的。有一个降低调用开销的优化技术...阅读全文

阅读:1995 评论:0

剖析使Go语言高效的5个特性(3/5): 垃圾回收机制

翻译原文链接 转帖/转载请注明出处 英文原文链接 发表于2014/06/07 垃圾回收机制(Garbage Collection) Go语言因为强制的内存垃圾回收机制变得更加简单和安全。但这并不意味着垃圾回收机制把Go程序变慢了,或者说垃圾回收机制最终决定了你程序的速度。不可否认,在堆(heap)上分配内存是有代价的。每次垃圾回收机制触发都会消耗一定的CPU。除非内存都被释放了,这些开销是不可避免的。 但是还有另外一个地方我们可以用来分配内存。那就是栈(stack)。 与C语言不同,Go语言不需...阅读全文

2017-08-13 13:34:58 曼托斯
阅读:1727 评论:0

Go的三色标记GC

三色标记 三色标记的原理如下:整个进程空间里申请每个对象占据的内存可以视为一个图, 初始状态下每个内存对象都是白色标记,先stop the world,将扫描任务作为多个并发的goroutine立即入队给调度器,进而被CPU处理,第一轮先扫描所有可达的内存对象,标记为灰色放入队列;第二轮可以恢复start the world,将第一步队列中的对象引用的对象置为灰色加入队列,一个对象引用的所有对象都置灰并加入队列后,这个对象才能置为黑色并从队列之中取出。循环往复,最后队列为空时,整个图剩下的白色内...阅读全文

阅读:6167 评论:0