в uintptr и обратно. Вот такая строчка p := unsafe.Pointer(uintptr(unsafe.Pointer(s)) + unsafe.Offsetof(s.b))
Вопрос, почему она безопасна с точки зрения gс? Наверное тут надо понимать механизм работы gc.. Если кто знает не слишком сложный материал про правила работы gc для новичков буду признаетелен весьма!
новичкам не нужно uintptr и unsafe
а почему для GC это норм см. в https://golang.org/pkg/unsafe/#Pointer (2) Conversion of a Pointer to a uintptr (but not back to Pointer).
TL;DR; она не безопасна ;) GC не следит за твоими uintptr
В этом пункте написано наоборот
Вот статья , она не корректна ? https://golangbyexample.com/understanding-uintptr-golang/
the garbage collector will not update that uintptr's value if the object moves,
где там пишут что uintptr безопасен?
Ну таки да, объект может быть перемещен
his below code is atomic with reference to the garbage collector.
Its value will not be updated if the corresponding object moves. Eg When goroutine stack changes The corresponding object can be garbage collected. The GC does not consider uintptr as live references and hence they can be garbage collected.
операция атомарна, это не значит что безопасна
It lists down when the above conversion can be safe. See the below code for the scenario mentioned above. In the below code we are doing arithmetic like below to get to address of field “b” in struct sample and then printing the value at that address. This below code is atomic with reference to the garbage collector.
Обсуждают сегодня