Go 中的不安全指针:函数调用结束杀死数组

我正在编写一个库,我想向调用者返回一个非特定类型的数组(或写入一个数组)。类型可能会有所不同,具体取决于谁调用 - 但是,我可以从我的函数中创建尽可能多的所述类型的对象。一种方法是调用者创建一个数组,然后被调用者填充它——但是,没有办法知道这个数组将持续多长时间。(有没有办法让被调用者使调用者的数组变大?记住,被调用者只看到x interface{}......)


我选择的另一种方式是因为我不知道上面是如何可能的,调用者给了我他特定类型的指针,我将它重定向到我创建的对象数组。


下面是我的解决方案。我的问题:为什么函数调用后数组为空?他们在我操作后指向同一个数组,他们应该是一样的。我是否忽略了什么?我想过 GC,但它不可能那么快,是吗?


http://play.golang.org/p/oVoPx5Nf84


package main


import "unsafe"

import "reflect"

import "log"


func main() {

    var x []string

    log.Printf("before: %v, %p", x, x)

    manipulate(&x)

    log.Printf("after: %v, %p", x, x)

}


func manipulate(target interface{}) {

    new := make([]string, 0, 10)

    new = append(new, "Hello", "World")

    log.Printf("new: %v, %p", new, new)

    p := unsafe.Pointer(reflect.ValueOf(target).Pointer())

    ptr := unsafe.Pointer(reflect.ValueOf(new).Pointer())

    *(*unsafe.Pointer)(p) = ptr

}


波斯汪
浏览 263回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go