如何提升代码质量

2020-09-24
阅读 3 分钟
4.1k
何谓代码质量?代码是给人看的1. 书写规范:遵照自己公司制定的编程语言书写规范。 2. 易阅读。3. 易修改。 4. 易测试。代码是给机器运行的1. 安全2. 快速3. 稳定代码质量的标准?对于机器来说,标准是恒定的,但不可兼得。比如:锁机制:安全、慢指针:快、不稳定改内存地址:快、不安全总的来说,这就像 CAP 理论一样...

Go 1.13 errors 基本用法

2019-09-16
阅读 2 分钟
29.3k
Go 最新版本 1.13 中新增了 errors 的一些特性,有助于我们更优雅的处理业务逻辑中报错的问题。本文主要展示 errors 包中新增方法的用法。

Golang - 调度剖析【第三部分】

2018-12-11
阅读 10 分钟
5.9k
首先,在我平时遇到问题的时候,特别是如果它是一个新问题,我一开始并不会考虑使用并发的设计去解决它。我会先实现顺序执行的逻辑,并确保它能正常工作。然后在可读性和技术关键点都 Review 之后,我才会开始思考并发执行的实用性和可行性。有的时候,并发执行是一个很好的选择,有时则不一定。

Go 语言编译器的 "//go:" 详解

2018-10-19
阅读 4 分钟
17k
一上来不太好说明白 Go 语言里 //go: 是什么,我们先来看下非常简单,也是几乎每个写代码的人都知道的东西:C 语言的 #include。我猜,大部分人第一行代码都是 #include 吧。完整的就是#include <stdio.h>。意思很简单,引入一个 stdio.h。谁引入?答案是编译器。那么,# 字符的作用就是给 编译器 一个 指示,让编...

Go Defer 高级实践

2018-10-12
阅读 3 分钟
6.8k
任何一个特性都有它的设计初衷,主要是被用来解决什么问题的,任何一个特性也都有它合适和不合适出现的地方,我们清楚地了解并正确合理地使用,是非常重要的。

Golang - 调度剖析【第二部分】

2018-10-08
阅读 8 分钟
12.4k
回顾本系列的第一部分,重点讲述了操作系统调度器的各个方面,这些知识对于理解和分析 Go 调度器的语义是非常重要的。在本文中,我将从语义层面解析 Go 调度器是如何工作的,并重点介绍其高级特性。Go 调度器是一个非常复杂的系统,我们不会过分关注一些细节,而是侧重于剖析它的设计模型和工作方式。我们通过学习它的优...

Go 程序是如何编译成目标机器码的

2018-09-26
阅读 10 分钟
11.9k
今天我们一起来研究 Go 1.11 的编译器,以及它将 Go 程序代码编译成可执行文件的过程。以便了解我们日常使用的工具是如何工作的。本文还会带你了解 Go 程序为什么这么快,以及编译器在这中间起到了什么作用。

6. Go 性能调优之 —— 总结

2018-09-11
阅读 1 分钟
4.6k
原文链接:[链接]本文使用 Creative Commons Attribution-ShareAlike 4.0 International 协议进行授权许可。 总结 保持简单 从最简单的代码开始。 测量! 分析你的代码来找到瓶颈, 不要猜测 ! 如果性能还不错, 收手吧 !你不需要优化所有的代码,只需要针对影响最大的部分就可以了。 不是程序的每部分都需要高性能 对...

5. Go 性能调优之 —— 技巧

2018-09-11
阅读 6 分钟
12.4k
原文链接:[链接]本文使用 Creative Commons Attribution-ShareAlike 4.0 International 协议进行授权许可。 技巧 本节包含一些优化 Go 代码的技巧。 减少分配 确保你的 APIs 不会给调用方增加垃圾。 考虑这两个 Read 方法 {代码...} 第一个 Read 方法不带参数,并将一些数据作为[]byte返回。 第二个采用[]byte缓冲区并...

4. Go 性能调优之 —— 跟踪

2018-09-11
阅读 3 分钟
9.1k
与pprof不同的是,正如我们在检查 Go 程序当前执行的内容之前看到的,执行跟踪器使 Go 运行时在每次事件发生时主动报告。这些事件可以是 goroutine 的创建、系统调用、堆大小的更改等等。每次发生这些事件中的一个时,都会报告其时间戳和大多数事件的堆栈跟踪。

3. Go 性能调优之 —— 性能测量和分析

2018-09-11
阅读 8 分钟
15.7k
原文链接:[链接]本文使用 Creative Commons Attribution-ShareAlike 4.0 International 协议进行授权许可。 性能测量和分析 在先前的部分,我们研究了对单个函数的基准测试,当您提前知道瓶颈在哪里时,这是非常有用的。然而,你经常会发现自己处于提问的位置 为什么这个程序要运行这么长时间? 剖析整个程序,这对于回...

2. Go 性能调优之 —— 编译优化

2018-09-11
阅读 7 分钟
24.1k
原文链接:[链接]本文使用 Creative Commons Attribution-ShareAlike 4.0 International 协议进行授权许可。 编译优化 本节介绍Go编译器执行的三个重要优化。 逃逸分析 内联 死码消除 Go 编译器的历史 Go 编译器在2007年左右开始作为 Plan9 编译器工具链的一个分支。当时的编译器与 Aho 和 Ullman 的 Dragon Book 非常相...

1. Go 性能调优之 —— 基准测试

2018-09-11
阅读 10 分钟
18.3k
原文链接:[链接]本文使用 Creative Commons Attribution-ShareAlike 4.0 International 协议进行授权许可。 基准测试 本节重点讨论如何使用 Go 测试框架构建一个有效的基准测试,并提供一些实用的技巧来避免性能缺陷。 基准测试的基本规则 在进行基准测试之前,我们必须要有一个稳定的环境来获得可重现的结果。 机器必...

Go Reflect 高级实践

2018-08-31
阅读 6 分钟
19.6k
[链接] 最重要的官方文档,建议先粗读一遍再来看本文。 go 的 reflect 还是比较简单的,可以很快上手。 [链接] [链接]源码中有上百个 panic,各种检查做的很全面,有想法就大胆地去试,只要能 run 起来,一般问题不大。 实际使用中可以先不考虑使用 reflect 对性能的影响,先实现功能,再利用 benchmark test 去优化

Go Channel 高级实践

2018-08-29
阅读 2 分钟
14.8k
本文主要讲实践,原理部分会一笔带过,关于 go 语言并发实现和内存模型后续会有文章。 channel 实现的源码不复杂,推荐阅读,[链接] channel 是干什么的 意义:channel 是用来通信的 实际上:(数据拷贝了一份,并通过 channel 传递,本质就是个队列) channel 应该用在什么地方 核心:需要通信的地方 例如以下场景: 通...

Go Slice 高级实践

2018-08-23
阅读 3 分钟
11.7k
以下用法中,类型均使用 int64 做为示例,不处理 interface 。 代码只是展示实现思路,不一定完善。 合并两个有序切片,新切片仍然有序 {代码...} 根据特定规则过滤元素 {代码...} 去重 两种思路,循环顺序查找和使用 map 加快查找(引入一个 map 在各方面也是有开销的)。选用哪种,可以通过具体场景的 Benchmark 决定 ...

Golang - 调度剖析【第一部分】

2018-08-16
阅读 6 分钟
15.6k
首先,Golang 调度器的设计和实现让我们的 Go 程序在多线程执行时效率更高,性能更好。这要归功于 Go 调度器与操作系统(OS)调度器的协同合作。不过在本篇文章中,多线程 Go 程序在设计和实现上是否与调度器的工作原理完全契合不是重点。重要的是对系统调度器和 Go 调度器,它们是如何正确地设计多线程程序,有一个全面...

Go 中 io 包的使用方法

2018-07-10
阅读 10 分钟
47.3k
在 Go 中,输入和输出操作是使用原语实现的,这些原语将数据模拟成可读的或可写的字节流。为此,Go 的 io 包提供了 io.Reader 和 io.Writer 接口,分别用于数据的输入和输出,如图: