我正在用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?
}
代码有效吗?
答案 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