> newItem = new(KdElem) > if itemfunc(arg, &newItem.item, newItem.size) != 0
"newItem.item" is a "interface{}" with a nil value. Doing "&newItem.item" then turns it into a "*interface{}" That is why you cannot do "var realval *int64 = val.(*int64)" To make it work as what I think you intend to do you would have to do: https://play.golang.org/p/kpErE88hEyz > newItem = new(KdElem) > newItem.item = new(int64) > if itemfunc(arg, newItem.item, newItem.size) != 0 or https://play.golang.org/p/rV39qFOnZpW > newItem = new(KdElem) > var item int64 > if itemfunc(arg, &item, newItem.size) != 0 > newItem.item = item On Tuesday, 12 January 2021 at 11:16:21 pm UTC+8 Steve Murphy wrote: > 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/18472866-5c8c-4e63-8848-02f5d042b564n%40googlegroups.com.