Могу ли я преобразовать * interface {} в * int, используя unsafe.Pointer in Go - PullRequest
0 голосов
/ 24 января 2019

Я делаю пул памяти в Go.
Я делаю это, потому что неявное преобразование int в интерфейс {} вызовет выделение памяти. Я хочу избежать выделения.
Я хочу выделить несколько типовуказатели в одном пуле.
Пул - что-то вроде этого.

type creator struct{
    buf []interface{}
}
func (cr *creator) Create()*interface{}{
    if len(cr.buf)==0{
        cr.buf=make([]interface{},256)
    }
    current:=&cr.buf[0]
    cr.buf=cr.buf[1:]
    return current
}

func (cr *creator)CreateInt()*int{
    pointer:=cr.Create()
    return (*int)(unsafe.Pointer(pointer))   // <-- right or wrong?
}

Код действителен?

1 Ответ

0 голосов
/ 24 января 2019

У вас есть *interface {}, и вы хотите сделать вид, что это *int! Как это будет работать?

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var cr creator
    pointer := cr.CreateInt()
    fmt.Printf("%T\n", pointer) // *int
}

type creator struct {
    buf []interface{}
}

func (cr *creator) Create() *interface{} {
    if len(cr.buf) == 0 {
        cr.buf = make([]interface{}, 256)
    }
    current := &cr.buf[0]
    cr.buf = cr.buf[1:]
    return current
}

func (cr *creator) CreateInt() *int {
    pointer := cr.Create()
    fmt.Printf("%T\n", pointer)            // *interface {}
    return (*int)(unsafe.Pointer(pointer)) // *interface {} to *int
}

Детская площадка: https://play.golang.org/p/TLF7kbYPA0M

Выход:

*interface {} 0x452000
*int 0x452000
...