LINUX.ORG.RU

Каст из unsafe указателя

 


0

1

Пробую написать первый хеловорлд на Го. И хочу сделать каст в/из unsafe указателя. Делаю так:

    package main
    
    import (
    	"unsafe"
    )
    
    type I interface {
    	GetX() int
    }
    
    type A struct {
    	x int
    }
    
    type B struct {
    	x int
    	y int
    }
    
    func (self *A) GetX() int {
    	return self.x
    }
    
    func (self *B) GetX() int {
    	return self.x
    }
    
    func main() {
    	a := A{x: 17}
    	b := B{x: 42, y: -1}
    
    	var i I
    
    	p := unsafe.Pointer(&a)
    	i = I(p) // ошибка 1
    
    	p = unsafe.Pointer(&b)
    	i = I(p) // ошибка 2
    }

Компиляция выдает:

.\main.go:35: cannot convert p (type unsafe.Pointer) to type I: unsafe.Pointer does not implement I (missing GetX method)
.\main.go:38: cannot convert p (type unsafe.Pointer) to type I: unsafe.Pointer does not implement I (missing GetX method)

А как сделать каст правильно из unsafe указателя на интерфейс?


А как сделать каст правильно из unsafe указателя на интерфейс?

И вот зачем ты пытаешься выстрелить себе в ногу ?

func main() {
	a := A{x: 17}
	b := B{x: 42, y: -1}

	var i I

	p := unsafe.Pointer(&a)
	i = I((*A)(p))

	p = unsafe.Pointer(&b)
	i = I((*B)(p))
}

joy4eg ★★★★★ ()
Ответ на: комментарий от joy4eg

А если в 'p' хранится указатель на B, а я сделаю «i = I((*A)(p))» - ничего не сломается?

Выстрелить хочу по причине атомарности. Я так понял, что CompareAndSwap я могу сделать либо со числовыми типами, либо с unsafe Pointer, вот и привожу «нормальные» указатели к unsafe pointer и обратно.

Я во всем неправ и надо делать по-другому? А как?

jcdr ()
Ответ на: комментарий от jcdr

Я во всем неправ и надо делать по-другому?

true

А как?

Смотря что ты хочешь сделать, судя по CompareAndSwap тебе нужны какие-то атомарные операции с сравнением и заменой.
ИМХО, Я бы запустил го-рутину, и канал для обмена данными (отправка-чтение из каналов атомарны). Это будет более Go-way.
И еще почитай это.

joy4eg ★★★★★ ()

unsafe pointers на то и unsafe что их не рекомендуется использовать. Расскажи какой алгортм ты хочешь получить и тебе подскажут как это сделать на каналах.

pftBest ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.