Yes  you are right . thanks a lot and I try more debug info and have 
looked that:


func main() {
    println("debug")
    a := interface{}(100)
    println(&a, a)
    b := fmt.Sprint(a)
    println("debug1", b, &b, Pointer(*((*uintptr)(Pointer(&b)))), *((*int)(
Pointer(uintptr(Pointer(&b)) + 8))))
}

and add debug info to runtime/mallocgc.go file
here is the output:

debug
mallocgc: 8
mallocgc return2: 0xc20800a220
0xc208039f68 (0xa00a0,0xc20800a220)
mallocgc: 3
mallocgc return2: 0xc20800a230
debug1 100 0xc208039f48 0xc20800a230 3

在 2016年10月3日星期一 UTC+8上午9:47:18,Dave Cheney写道:
>
> On Monday, 3 October 2016 12:39:34 UTC+11, 刘桂祥  wrote: 
> > package main 
> > 
> > 
> > import ( 
> >     "fmt" 
> > ) 
> > func main() { 
> >     a := interface{}(100) 
> >     println(&a, a) 
> >     fmt.Sprint(a) 
> > } 
> > 
> > 
> > go run x.go  the output: 
> > 
> > 
> > 0xc42003bf18 (0x89040,0xc42000a2c0) 
> > 
> > 
> > 
> > I just want to ask 0xc42000a2c0 as the a (interface{}) 's data pointer 
> is point to where ? heap ? 
>
> It is on the heap, the value escapes when passed to fmt,Sprint 
>
> > 
> > also I test this: 
> > 
> > 
> > func BenchmarkFmtEscap3(b *testing.B) { 
> >     b.ReportAllocs() 
> > 
> > 
> >     for i := 0; i < b.N; i++ { 
> >         a := interface{}(100) 
> >         fmt.Sprint(a) 
> >     } 
> > } 
> > 
> > 
> > BenchmarkFmtEscap3-4            10000000               141 ns/op         
>      16 B/op       2 allocs/op 
> > 
> > 
> > 
> > why is 2 allocs and 16bytes ?? 
>
> One for a, which escapes to the heap when passed to fmt.Sprint, and one 
> for the value returned from fmt,Sprint 
>
>

-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to