Jams Blog

却将万字平戎策,换得东家种树书。

Go 调度模型

go GMP

G M P G P M 模型 定义于src/runtime/runtime2.go: G: Gourtines, 每个Goroutine对应一个G结构体,G保存Goroutine的运行堆栈,即并发任务状态。G并非执行体,每个G需要绑定到P才能被调度执行。 P: Processors, 对G来说,P相当于CPU核,G只有绑定到P(在P的local runq中)才能被调度。对M来说...

线程安全的map

go map

Maps are not safe for concurrent use: it’s not defined what happens when you read and write to them simultaneously. If you need to read from and write to a map from concurrently executing gorout...

Goroutine ID

Goroutine ID

Goroutine ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func GetGoid() int64 { var ( buf [64]byte n = runtime.Stack(buf[:], false) stk = strings.TrimPrefix(string(buf[:n]), ...

Go ratelimit

Ratelimit 服务流量限制 wzyonggege/ratelimiter 1. 限流方法 漏桶 漏桶是指我们有一个一直装满了水的桶,每过固定的一段时间即向外漏一滴水。如果你接到了这滴水,那么你就可以继续服务请求,如果没有接到,那么就需要等待下一滴水。 令牌桶 令牌桶则是指匀速向桶中添加令牌,服务请求时需要从桶中获取令牌,令牌...

GO empty struct{}

<- struct{}{}

GO empty struct{} 空struct 节省内存 1 2 3 a := struct {}{} fmt.Println(unsafe.Sizeof(a)) // 0 channel struct{} 1 2 3 4 5 6 7 8 9 10 11 func main() { done := make(chan struct{}) go func(...

A logger base on zap

基于Zap,可选日志文件归档方式

logger wzyonggege/logger | 基于Zap,可选日志文件归档方式 https://github.com/wzyonggege/logger Feature 根据info/warn级别切割日志文件 根据文件大小归档 根据时间归档 时间切割单元可选 Usage 1 2 install logger with go g...

Golang Signal

信号处理

Golang Signal 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方式。 一个信号就是一个异步的通知,发送给某个进程,或者同进程的某个线程,告诉它们某个事件发生了。 当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。 Bilibili ...

Making a RESTful JSON API in Go with Mux

Making a RESTful JSON API in Go with Mux Making a RESTful JSON API in Go 原文 https://thenewstack.io/make-a-restful-json-api-go/ A Basic Web Server 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1...

Go搭建HTTP服务器

In this example you will learn how to create a basic HTTP server in Go. First, let’s talk about what our HTTP server should be capable of. A basic HTTP server has a few key jobs to take care of.

创建 http 服务端 服务端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package main import ( "fmt" "net/http" ) func sayHello(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL.Path) w.Write([]by...

Learn Go in X Minutes

A Tour of Go

Hello World 1 2 3 4 5 6 7 package main import "fmt" func main() { fmt.Printf("Hello, world or 你好,世界 or Καλημέρα κόσμε or こんにちは世界\n") } It prints following information. Hello, world or 你好,...