前言
几乎所有人都遇到过类似下面的 go 代码:
if err != nil {
return nil, err
}
几乎所有人都遇到过类似下面的 go 代码:
if err != nil {
return nil, err
}
在冯·诺伊曼的设计理念的指导下,计算机将计算与存储这个两大核心模块进行分离,二者通过总线连接,协调工作:
对于计算而言,CPU 无疑是核心(CPU 内部结构无需过多关注),但对于存储而言,则要麻烦的多。
一直以来我们都在享受 Go 语言带来的便利,却不知道它一直在为我们负重前行。本文我们将从底层出发,从 Hello World 这个最基本例子来看看 Go 是如何运行的。重新审视 Hello World,保持对 Hello World 的敬畏。
本文涉及知识点有:
为了帮助大家能够更好的理解 Go 运行流程,这里会先介绍一些前置知识,如果你已经熟稔于心可以直接选择跳过,如果你还一知半解,那么请随我一起来回顾回顾。
在 Go runtime 中存在了大量由 plan9 汇编书写的代码,想要了解 runtime 的实现和机制,掌握 plan9 汇编的基本使用是必须的。(Go 的作者们在选择汇编语言的时候没有选择 intel,也没有选择 AT&T,而是选择了 plan9,哎,一群固执老古董们)。
plan9 语法虽然与 intel 和 AT&T 略有不同,但整体而言相差不大,如果你之前有其它汇编语言的基本,相信入手也很快。
下面会介绍一些 plan9 中的常见语法,想要深入了解的可以查看本文的参考资料。
在上一篇文章中,笔者分享了 go 中两个有意思的技巧。
而最近一段时间,笔者重新梳理了一下 go 知识点,并深入地看看了它的源码,在实践中又有了新的沉淀,于是写下这篇文章和大家分享一下。
我们知道,go 有一层很重的运行时(runtime),包括内存管理、goroutine 调度等重要组件;这些组件极大地方便了应用程序的开发和迭代,但也带来了一些问题,比如:
熟悉 Java、Rust 的同学,肯定都非常喜欢其 Stream API,以 Java 为例,筛选一个简单的数字列表,可以有如下实现:
boolean ok = Stream.of(1, 2, 3, 4, 5).
map(item -> item + 100).
filter(item -> item > 102).
allMatch(item -> item > 102);
最近,在写 Go 代码的时候,发现了其特别有意思的两个奇技淫巧,于是写下这篇
文章和大家分享一下。
按照 Go 的编译约定,代码包内以小写字母开头的函数、变量是私有的:
package test
// 私有
func abs() {}
// 公共
func Abs() {}
最近在业务性能优化过程中,大量使用到了 pool 池化、缓存等技术。在用 pool 的时候一知半解
地怼了上去,待上线过后就得抽时间系统学习、总结一下,于是就有了这篇文章。
首先,我们从一个场景出发,在一个简单的 http 接口服务中,如下:
func handleV1(writer http.ResponseWriter, req *http.Request) {
var (
err error
data []byte
)
// ....
data, err = ioutil.ReadAll(req.Body)
if err != nil {
return
}
// ...... json.Unmarshal 之类的
}