Thanks, I see. How about this one? I use a temp variable to store sh.Data, sh/ds/data are all no longer mentioned at the point when unsafe.Slice is called. Do I need to use runtime.KeepAlive?
package main import ( "fmt" "reflect" "runtime" "unsafe" ) var b []byte func f(data interface{}) { switch ds := data.(type) { case []int32: sh := (*reflect.SliceHeader)(unsafe.Pointer(&ds)) l := len(ds) d := sh.Data runtime.GC() b = unsafe.Slice((*byte)(unsafe.Pointer(d)), l*4) } // runtime.KeepAlive(data) } func main() { f([]int32{1, 2}) runtime.GC() fmt.Println(b) } 在2021年9月23日星期四 UTC+8 上午6:11:48<Ian Lance Taylor> 写道: > On Wed, Sep 22, 2021 at 1:22 AM Cholerae Hu <chole...@gmail.com> wrote: > > > > https://play.golang.org/p/WJTH-lUukeb > > > > Do I need to uncomment line 23? IMHO, variable data and ds will not be > used after line 16, so they can be collected in runtime.GC. But running it > with gccheckmark=1 and clobberfree=1 doesn't show any problems. > > > > Are there any documents about the details or behavior of liveness > analysis? > > I don't see any reason why that program should need runtime.KeepAlive. > > The local variable sh will point to data (aka ds), so the object will > stay alive. This is not different than p := &data. After that point, > if data is no longer mentioned, then the variable data is no longer > live, but the value that p points to will remain alive. > > Ian > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/6aa18cf5-6c03-4514-80bd-c8ceaaf842ffn%40googlegroups.com.