分类 Golang 中的文章

Golang|truetype解析

最近工作上遇到需要解析ttf字库的需求,判断给到的数据中是否有不存在ttf字库中的汉字,结果查询一遍之后发现,使用golang解析ttf做判定的代码基本没有,因此本文开始详细分析一波ttf字库文件,并尝试使用golang解析,实现相关需求。

……

阅读全文

Golang|plan9汇编

当我们使用go tool compile -S -N -l xxx.go命令,查看go语言对应的汇编代码时,生成的一行行汇编指令可能让人困惑,由于Go 使用了plan9 汇编,因此这篇文章接下来记录一下基础的plan9汇编知识。

……

阅读全文

Golang|分布式事务管理DTM

学习新东西,先是灵魂3问————是什么、解决什么问题、有什么好处?

首先,DTM是什么?DTM是一款开源的分布式事务管理器,解决跨数据库、跨服务、跨语言栈更新数据的一致性问题。

……

阅读全文

Golang|interface

接口是一种抽象类型,它没有暴露所含数据的布局或者内部结构,当然也没有哪些数据的基本操作,所提供的仅仅是一些方法。当你拿到一个接口类型的变量,你无从知道它是什么,但你能知道它能做什么,或者更精确地讲,仅仅是它提供了哪些方法。

……

阅读全文

Golang|go-snowflake

go-snowflake

在单机系统中我们会使用自增id作为数据的唯一id,自增id在数据库中有利于排序和索引,但是在分布式系统中如果还是利用数据库的自增id会引起冲突,自增id非常容易被爬虫爬取数据。在分布式系统中有使用uuid作为数据唯一id的,但是uuid是一串随机字符串,所以它无法被排序。

……

阅读全文

Golang|使用注意

select break

go中使用for select 结构,select的break只能跳出break,不能跳出for循环

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan int)
	ok := make(chan bool)
	go func() {
		ch <- 1
		ch <- 2
		ch <- 3
		close(ch)
	}()
	go test(ch, ok)
	<-ok
}

func test(ch chan int, ook chan bool) {
	for {
		select {
		case resp, ok := <-ch:
			if !ok {
				break
			}
			fmt.Println(resp)
		case <-time.After(time.Second):
			fmt.Printf("1s now!")
			break
		}
	}
}

chan close

向关闭的chan读取数据,chan会返回相关的空数据,内置类型返回0值数据,自定义struct返回空指针

……

阅读全文

Golang|test

go test测试包

go test {测试文件所在包目录}

当前目录下单测指定测试函数

$ go test -v -test.run {函数名xxx}

cover信息采集用例

  1. go test -coverprofile cp.out-
  2. go tool cover -html=cp.out

其他信息采集

  • -blockprofilerate n:goroutine 阻塞时候打点的纳秒数。默认不设置就相当于 -test.blockprofilerate=1,每一纳秒都打点记录一下。
  • -coverprofile cover.out:在所有测试通过后,将覆盖概要文件写到文件中。设置过 -cover。
  • -cpuprofile cpu.out:在退出之前,将一个 CPU 概要文件写入指定的文件。
  • -memprofile mem.out:在所有测试通过后,将内存概要文件写到文件中。
  • -memprofilerate n:开启更精确的内存配置。如果为 1,将会记录所有内存分配到 profile。

bench测试

Golang|panic、recover

panic

结构体

panic 关键字在 Go 语言的源代码是由数据结构runtime._panic表示的。每当我们调用 panic 都会创建一个如下所示的数据结构存储相关信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
type _panic struct {
	argp      unsafe.Pointer
	arg       interface{}
	link      *_panic
	recovered bool
	aborted   bool

	pc     uintptr
	sp     unsafe.Pointer
	goexit bool
}

结构体中字段含义说明:

……

阅读全文

Golang|垃圾回收

垃圾回收

垃圾回收(Garbage Collection,简称GC)是编程语言中提供的内存管理功能。

通过引入了语言层面的自动内存管理,也就是语言的使用者只用关注内存的申请而不必关心内存的释放,内存释放由虚拟机(virtual machine)或运行时(runtime)来自动进行管理。这种对不再使用的内存资源进行自动回收的功能就被称为垃圾回收。

……

阅读全文