我可以在Go中使用unsafe.Pointer将* interface {}转换为* int吗

时间:2019-01-24 02:41:46

标签: go type-conversion

我正在用Go创建一个内存池。
我这样做是因为将int隐式转换为interface {}会触发内存分配。我想避免这种分配。
我想在一个池中分配几种类型的指针。
游泳池就是这样。

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 :(得分:1)

您有*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