Go 延迟函数 defer 详解
摘要:Go 延迟函数 defer 详解Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer、return、返回值、panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!先来运行下面两段代码:A. 匿名返回值的情况package mainimport ( "fmt")fun...
阅读全文
Go语言Context(设计及分析)
摘要:context简单概述:Go服务器的每个请求都有自己的goroutine,而有的请求为了提高性能,会经常启动额外的goroutine处理请求,当该请求被取消或超时,该请求上的所有goroutines应该退出,防止资源泄露。那么context来了,它对该请求上的所有goroutines进行约束,然后进行取消信号,超时等操作。而context优点就是简洁的管理goroutines的生命周期。conte...
阅读全文
Golang中使用lua进行扩展
摘要:前言最近在项目中需要使用lua进行扩展,发现github上有一个用golang编写的lua虚拟机,名字叫做gopher-lua.使用后发现还不错,借此分享给大家.数据类型lua中的数据类型与golang中的数据类型对应关系作者已经在文档中说明,值得注意的是类型是以L开头的,类型的名称是以LT开头的.golang中的数据转换为lua中的数据就必须转换为L开头的类型:str := "hello" nu...
阅读全文
Go 语言之三驾马车
摘要:interfaceGo是一门面向接口编程的语言,interface的设计自然是重中之重。Go中对于interface设计的巧妙之处就在于空的interface可以被当作“Duck”类型使用,它使得Go这样的静态语言拥有了一定的动态性,却又不损失静态语言在类型安全方面拥有的编译时检查的优势。source code从底层实现来看,interface实际上是一个结构体,包含两个成员。其中一个成员指针指向...
阅读全文
理解channel 工作原理以及源码
摘要:Go 的并发特性 goroutines: 独立执行每个任务,并可能并行执行channels: 用于 goroutines 之间的通讯、同步一个简单的事务处理的例子 对于下面这样的非并发的程序:func main() { tasks := getTasks() // 处理每个任务 for _, task := range tasks { process(task) }}将其转换为 Go...
阅读全文
《effective Go》读后记录
摘要:格式化让所有人都遵循一样的编码风格是一种理想,现在Go语言通过gofmt程序,让机器来处理大部分的格式化问题。gofmt程序是go标准库提供的一段程序,可以尝试运行它,它会按照标准风格缩进,对齐,保留注释,它默认使用制表符进行缩进。Go标准库的所有代码都经过gofmt程序格式化的。注释Go注释支持C风格的块注释/* */和C++风格的行注释//。块注释主要用作包的注释。Go官方提倡每个包都应包含一...
阅读全文
《Go in action》读后记录:Go的并发与并行
摘要:一、使用goroutine来运行程序1.Go的并发与并行Go的并发能力,是指让某个函数独立于其他函数运行的能力。当为一个函数创建goroutine时,该函数将作为一个独立的工作单元,被 调度器 调度到可用的逻辑处理器上执行。Go的运行时调度器是个复杂的软件,它做的工作大致是:管理被创建的所有goroutine,为其分配执行时间将操作系统线程与语言运行时的逻辑处理器绑定参考The Go schedu...
阅读全文
kcp-go源码解析
摘要:概念ARQ:自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一.RTO:Retransmission TimeOutFEC:Forward Error Correctionkcp简介kcp是一个基于udp实现快速、可靠、向前纠错的的协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传...
阅读全文
golang string和[]byte的对比
摘要:golang string和[]byte的对比为啥string和[]byte类型转换需要一定的代价?为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) int?string和[]byte,底层都是数组,但为什么[]byte比string灵活,拼接性能也更高(动态字符串拼接性能对比)?今天看了源码探究了一下。以下所有观点都是个人愚见,有不同建议或补充的的欢迎...
阅读全文
Go-技篇第一 技巧杂烩
摘要:Go-技篇第一 技巧杂烩一句话技巧把你面向对象的大脑扔到家里吧,去拥抱接口。@mikegehard学习如何使用Go的方式做事,不要把别的的编程风格强行用在Go里面。@DrNic多用接口总比少用好。@evanphx拥抱这种简洁、并行、工整的语言。@francesc阅读官网golang.org上所有的文档,真是棒呆了。@vbatts别忘了用gofmt。@darkhelmetlive多读源代码。@DrN...
阅读全文
Go-技篇第二 命名规范
摘要:优秀的命名优秀的命名应当是一贯的、短小的、精确的。所谓一贯,就是说同一个意义在不同的环境下的命名应当一致,譬如依赖关系,不要在一个方法中命名为depend,另一个方法中命名为rely。所谓短小,不必多言,当命名过长的时候,读者可能更关注命名本身,而忽视真正的逻辑内容。所谓精确,就是命名达意、易于理解首条经验声明位置与使用位置越远,则命名应当越长。骆驼命名法Go语言应该使用 MixedCa...
阅读全文
Golang 的内存管理(上篇)
摘要:Golang 的内存管理基于 tcmalloc,可以说起点挺高的。但是 Golang 在实现的时候还做了很多优化,我们下面通过源码来看一下 Golang 的内存管理实现。下面的源码分析基于 go1.8rc3。1.tcmalloc 介绍关于 tcmalloc 可以参考这篇文章 tcmalloc 介绍,原始论文可以参考 TCMalloc : Thread-Caching Malloc。2. Golan...
阅读全文
Go 1.9 sync.Map揭秘
摘要:Go 1.9 sync.Map揭秘目录 [−]有并发问题的mapGo 1.9之前的解决方案sync.MapLoadStoreDeleteRangesync.Map的性能其它在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外...
阅读全文
Go的context的问题
摘要:Go的context的问题2017-05-29最近被由context引发的一个bug坑得不轻,所以反思一下Go的context的问题。context是隐式的约束,没有检测如果我们写一个函数,比如:func f(a int, b []byte) { } 我们知道它需要哪些参数,编译器是会帮我做检查的,当我调用f(3, "sdfsdf") 它就会报错。可是如果是context,就变成了一种隐式的约束,...
阅读全文
Golang 知识点总结
摘要:各种类型复制的时候的花费本节标题也可以叫做“各种类型的值的大小” (the sizes of values of all kinds of types),底层可被不同的值共享的数据的大小未被计算。下面的表格中一个 word在32bit操作系统中代表4个字节,在64bit操作系统中代表8个字节,内容基于官方的Go 1.7的编译器。TypeCost Of Value Copying (Value Si...
阅读全文
golang接口三个特性
摘要:类型和接口因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍。go是一个静态性语言,每个变量都有静态的类型,因此每个变量在编译阶段中有明确的变量类型,比如像:int、float32、MyType。。。比如:type MyInt int var i int var j MyInt变量i的类型为int,变量j的类型为MyInt,变量i、j具有确定的类型,虽然i、j的潜在类型是一样的,但是在没有...
阅读全文
[]T 还是 []*T, 这是一个问题
摘要:全面分析Go语言中的类型和类型指针的抉择目录 [−]副本的创建T的副本创建*T的副本创建如何选择 T 和 *T什么时候发生副本创建最常见的casemap、slice和数组for-range循环channel函数参数和返回值Method Receiver不同类型的副本创建bool,数值和指针数组map、slice 和 channel字符串函数参考文档在编程语言深入讨论中,经常被大家提起也是争论最多的...
阅读全文
十条有用的GO技术
摘要:十条有用的 Go 技术 这里是我过去几年中编写的大量 Go 代码的经验总结而来的自己的最佳实践。我相信它们具有弹性的。这里的弹性是指: 某个应用需要适配一个灵活的环境。你不希望每过 3 到 4 个月就不得不将它们全部重构一遍。添加新的特性应当很容易。许多人参与开发该应用,它应当可以被理解,且维护简单。许多人使用该应用,bug 应该容易被发现并且可以快速的修复。我用了很长的时间学到了这些事情。其中的...
阅读全文
JSON 的小技巧
摘要:有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。参考文章:http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/临时忽略struct字段临时忽略掉Password字段临时添加额外的字段临...
阅读全文
Clean http handlers in Go
摘要:IntroductionFor this blog post we are going to take a look at the http.HandlerFunc type and how we can improve it to make more elegant and clean handlers. Following the idioms of Go and staying compat...
阅读全文