In genBox your code is saying that val contains a pointer to interface{}. In 
other words its an interface{} that contains a *interface{}. That is a weird 
but valid construct.

I suggest you dereference it and see what the contained interface holds. 
Something like:

valDeref := val.(*interface{})

 fmt.Printf("val contains=%T", valDeref)

You may find that valDeref contains the *int64 you are looking for.

As an aside, *interface{} is usually an indication that someone somewhere is 
passing the wrong value to the function since it almost never makes sense to 
pass a pointer to interface{}.





On Mon, 11 Jan 2021, at 4:03 PM, Steve Murphy wrote:
> Hello!
> 
> I keep getting:
> panic: interface conversion: interface {} is *interface {}, not *int64 
> [recovered]
> panic: interface conversion: interface {} is *interface {}, not *int64
> 
> I *suspect* what is happening is that the KDElem struct has an item field 
> whose 
> type is interface{}, so that you can store a pointer to some struct (of your 
> own making),
> or an index into an array of structs, or... *whatever*, but in my case, it's 
> an index into an array
> of objects. The itemfunc (or genBox in my test code) is supposed to set the 
> item field in 
> the KDElem struct to the proper index, as the struct has just been created, 
> and the job
> of the itemfunc is to make it point to the right object, and set the bounds 
> info in the new struct.
> 
> type KdElem struct {
>     item       interface{} // a ptr to a particular struct, or an index into 
> an array of objects, or....
>     ...
> }
> 
> And the func that calls the itemfunc (genBox) looks like this:
> 
> func loadItems(itemfunc func(arg interface{}, val interface{}, size *KdBox) 
> int, arg interface{}, extent KdBox, length *int64, mean *float64) *KdElem {
>      ...
>      newItem = new(KdElem)
>      if itemfunc(arg, &newItem.item, newItem.size) != 0 {
>      ...
> 
> 
> And, in this case the itemfunc declaration looks like this:
> 
> func genBox(arg interface{}, val interface{}, box *KdBox) int {
>      var offsetp = arg.(*int64)         // successful
>      var offset = *offsetp                 // successful
>      // fmt.Printf("genBox: offset=%v offsetp=%v\n", offset, offsetp)
>      fmt.Printf("genBox: arg type=%T argval=%v,     val type=%T, val 
> val=%v\n", arg, arg, val, val)
>      if offset < KDBoxes {
>           fmt.Printf("genBox: val=%v  *int64=%v\n", val, val)
>           var realval *int64 = val.(*int64)     //  <<-- This is line 43!  
> Compiles.... but... Crash!!!
>           *realval = offset + 1
> ...
> 
> Now, I get this from a go test:
> 
> KdBuild: arg type=*int64  argval=0xc0000d2078; 
> genBox: arg type=*int64 argval=0xc0000d2078,     val type=*interface {}, val 
> val=0xc0000ba640
> genBox: val=0xc0000ba640  *int64=0xc0000ba640
> --- FAIL: TestKd1 (0.08s)
> panic: interface conversion: interface {} is *interface {}, not *int64 
> [recovered]
> panic: interface conversion: interface {} is *interface {}, not *int64
> 
> goroutine 19 [running]:
> testing.tRunner.func1(0xc000108100)
> /usr/lib/go-1.13/src/testing/testing.go:874 +0x3a3
> panic(0x523360, 0xc0000c2360)
> /usr/lib/go-1.13/src/runtime/panic.go:679 +0x1b2
> parsetree.com/kdtree.genBox(0x50eec0, 0xc0000d2078, 0x50ef40, 0xc0000ba640, 
> 0x0, 0x0)
> /home/murf/go/kdtree/kdtree1_test.go:43 +0x270
> parsetree.com/kdtree.loadItems(0x5570f8, 0x50eec0, 0xc0000d2078, 
> 0x7fffffffffffffff, 0x7fffffffffffffff, 0x8000000000000000, 
> 0x8000000000000000, 0xc00096ab38, 0xc00096ab30, 0x0)
> /home/murf/go/kdtree/kdtree.go:683 +0xec
> parsetree.com/kdtree.KdBuild(0x5570f8, 0x50eec0, 0xc0000d2078, 0x0)
> /home/murf/go/kdtree/kdtree.go:168 +0x17e
> parsetree.com/kdtree.TestKd1(0xc000108100)
> /home/murf/go/kdtree/kdtree1_test.go:72 +0x13a
> testing.tRunner(0xc000108100, 0x5570f0)
> /usr/lib/go-1.13/src/testing/testing.go:909 +0
> 
> How do I set realval to the (*int64) value that's in val?
> 
> murf
> 
> 
> -- 
> 
> Steve Murphy
> ParseTree Corporation
> 57 Lane 17
> Cody, WY 82414
> ✉  murf at parsetree dot com
> ☎ 307-899-0510
> 

> -- 
> 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/CAPPCp8HGQAcdw7J_vFLW8NKsXqfh5kgUtCrQn41dBLRamQggNA%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/CAPPCp8HGQAcdw7J_vFLW8NKsXqfh5kgUtCrQn41dBLRamQggNA%40mail.gmail.com?utm_medium=email&utm_source=footer>.

-- 
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/c109a5c7-e2a2-4905-a187-679142d0da7b%40www.fastmail.com.

Reply via email to