TGViewer
igoroutine.courses igoroutine.courses @igoroutine_courses · 239 subscribers
Post #19 437
🙄🙄 Как узнать номер горутины в Go?

Официальная позиция языка такая:

Goroutines do not have names; they are just anonymous workers. They expose no unique identifier, name, or data structure to the programmer. Some people are surprised by this, expecting the go statement to return some item that can be used to access and control the goroutine later.

The fundamental reason goroutines are anonymous is so that the full Go language is available when programming concurrent code. By contrast, the usage patterns that develop when threads and goroutines are named can restrict what a library using them can do.


Однако, иногда бывает нужно получить номер горутины, например, чтобы написать рекурсивный мьютекс, которого в Go нет, в отличие, например, от Java. Совсем недавно писали такой мьютекс на курсе.

Чтобы получить ID горутины, можно использовать stack trace
(Go Playground):


func Get() int64 {
var buf [64]byte
runtime.Stack(buf[:], false)

s := buf[len("goroutine "):]
s = s[:bytes.IndexByte(s, ' ')]

gid, _ := strconv.ParseInt(string(s), 10, 64)

return gid
}


Однако реализация через стектрейс довольно дорогая. Поэтому, более эффективно достать контекст горутины с помощью ассемблера, получив доступ к id:


// func getg() *g
TEXT ·getg(SB),NOSPLIT,$0-8
#ifdef GOARCH_386
MOVL (TLS), AX
MOVL AX, ret+0(FP)
#endif
#ifdef GOARCH_amd64
MOVQ (TLS), AX
MOVQ AX, ret+0(FP)
#endif
#ifdef GOARCH_arm
MOVW g, ret+0(FP)
#endif
#ifdef GOARCH_arm64
MOVD g, ret+0(FP)
#endif
#ifdef GOARCH_s390x
MOVD g, ret+0(FP)
#endif
RET

func Get() int64 {
return getg().goid
}


Более того, на гитхабе есть библиотека, которая поддерживает доступ к goroutineID для версий Go 1.3 и выше.

Важно понимать, что подобные решения не гарантируют обратную совместимость и их нужно использовать аккуратно.

Пишите в комментариях, какие темы осветить в будущих постах!
  • ❤ 8
  • 🔥 6
  • 👍 3
More from @igoroutine_courses
  1. Jun 25, 2026Разбор задачи с порядком вызова функций в select Что будет выведено в stdout после запуска…
  2. Jun 24, 2026Post #40
  3. Jun 24, 2026photo post
  4. Mar 24, 2026😎😎 Это изменение сломало set на map[key]struct{}, который мы знали Продолжение предыдуще…
  5. Mar 23, 2026😎😎 Это изменение сломало Set на map[key]struct{}, который мы знали В Go все привыкли пис…
  6. Mar 5, 2026😎😎 От этого data race не спасает даже race detector Продолжение к предыдущему посту. Ита…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →