/images/hugo/avatar.png

go hacker 编程

每个语言都有一些 hacker 编程,这些 hacker 编程在某些时候能起到奇效,但是不能被乱用。

1. 获取 goroutine id

获取 goroutine id,方式有两种,分别是

  1. 简单方式:通过 runtime.Stack 方法获取栈帧信息,栈帧信息里包含 goroutine id
  2. hacker 方式:
    • 原理: 我们获取运行时的 g 指针,反解出对应的 g 的结构。每个运行的 goroutine 结构的 g 指针保存在当前 goroutine 的一个叫做 TLS 对象中
    • 第一步:我们先获取到 TLS 对象
    • 第二步:再从 TLS 中获取 goroutine 结构的 g 指针
    • 第三步:再从 g 指针中取出 goroutine id。
    • 需要注意的是,不同 Go 版本的 goroutine 的结构可能不同,所以需要根据 Go 的不同版本进行调整。没必要重复造轮子,直接使用第三方库就可以: petermattis/goid

1.1 普通方式

runtime.Stack 方法可以获取当前的 goroutine 信息,第二个参数为 true 会输出所有的 goroutine 信息,信息的格式如下:

go 包和管理工具

go 程序包组织结构和程序管理工具箱

1. 包简介

包和模块的概念几乎存在于所有的编程语言之中,它的存在是为了简化大型程序的设计和维护工作。通过将一组相关的特性放进一个独立的单元以便于理解和更新,这种特性提供诸多益处:

go reflect

go 反射机制

1. 反射机制

反射是一个复杂的内省技术。所谓内省即可以动态获取变量的类型,值,以及方法属性等元数据。需要反射的根本原因是,很多时候我们在编程时,并不能确定输入的具体类型,需要我们动态去判断。

go 并发编程

Go 并发编程原语,Goroutines和Channels

1. GO 并发编程简介

上一篇我们讲解了 Go 语言中的接口,至此对于 Go 语言的类型系统我们基本上讲的差不都了。接下来我们将深入了解 Go 最为人推广的特性并发编程。对于那些完全独立的子问题,并发是简单的,但是真正复杂的是处理那些存在资源共享的多进程多线程并发问题。我们需要有效的通信机制来处理程序中的竞争条件,同时避免可能出现的死锁问题。

go 接口

Go 的泛型编程

1. 接口概述

接口是 Go 语言提供的泛型的核心概念。所谓泛型就是允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,目的是增加函数的通用性。当然我们没必要去纠结概念,最重要的是搞明白,Go 如何通过接口来提高程序的灵活性。

go 的结构体和方法

Go 的对象组合技术

1. 内容概要

方法是面向对象编程(OOP)中的概念。有关 OOP 的定义我也说不清楚。但是与概念相比,更重要的是OOP的两个关键点:封装和组合。我们的目的是看看 Go 语言如何通过结构体嵌入等技术实现这两个关键点。