Ian-- You missed the part about the arguments being "shifted left" above, which kinda looks like a compiler issue. Maybe something I wrote contributed to the problem, but I have no idea what. If this is a known problem, perhaps I can hand-install aa newer version, or something...?
murf On Tuesday, January 12, 2021 at 7:52:40 AM UTC-7 Ian Davis wrote: > Note the error says that val was nil, so your type assertion will panic. > You can read more about how to make type assertions that report success or > failure in the Go Tour: https://tour.golang.org/methods/15 > > Have you tried printing the type of what you receive before attempting the > type assertion? I suspect that the system you are working with is passing > you a variety of different types depending on the context, so you'll need > to be flexible in what you handle. > > > > > > On Tue, 12 Jan 2021, at 5:55 AM, Steve Murphy wrote: > > Many thanks, Ian, I appreciate your suggestions! > > I added your code snippet to my program, and got: > > panic: interface conversion: interface {} is nil, not *interface {} > [recovered] > panic: interface conversion: interface {} is nil, not *interface {} > > According to the trace, it looks like it's crashing while trying to > evaluate the valDeref := line. > > Looking at the trace provided: > > genBox: arg type=*int64 argval=0xc00001a150, val type=<nil>, val > val=<nil> offset=0 > genBox: box=<nil> > --- FAIL: TestKd1 (0.09s) > panic: interface conversion: interface {} is nil, not *interface {} > [recovered] > panic: interface conversion: interface {} is nil, not *interface {} > > goroutine 6 [running]: > testing.tRunner.func1(0xc000020200) > /usr/lib/go-1.13/src/testing/testing.go:874 +0x3a3 > panic(0x523360, 0xc0000bc330) > /usr/lib/go-1.13/src/runtime/panic.go:679 +0x1b2 > parsetree.com/kdtree.genBox(0x50eec0, 0xc00001a150, 0x0, 0x0, 0x0, 0x2) > /home/murf/go/kdtree/kdtree1_test.go:43 +0x43e > > It kinda looks like the %T and %v aren't working for val; but the stack > trace shows 0xc00001a150 in the second argument to genBox. > > Uh, wait a minute! According to the stack, the first arg (called arg) is > 0x50eec0; but the debug output from genbox shows arg's val is 0xc00001a150, > which is what the second arg should be. So it looks like the args have > shifted to the left one position! And no errors on compilation? > > I don't know what to think. > > BTW, I'm on ubuntu 20.04, and the version of go is 1.13. > > murf > > On Monday, January 11, 2021 at 10:45:29 AM UTC-7 Ian Davis wrote: > > > 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 <(307)%20899-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...@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...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/3763f6a4-0475-4c5a-96d5-33baea5348aan%40googlegroups.com > > <https://groups.google.com/d/msgid/golang-nuts/3763f6a4-0475-4c5a-96d5-33baea5348aan%40googlegroups.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/3990c183-d39c-4f42-b592-92b4c26274d9n%40googlegroups.com.