Thanks Axel. 

Good to know the first part. I have a couple of comments regarding your 
answer to the second part.

In regards to your second question: That would require having an array type 
> for every possible size, which isn't really tenable.
>
The idea was to use the same array type (`[(^uint(0)) >> 17]uint64`) 
regardless of the actual size. I would use `&s[0]` just like you suggest, 
but avoid the use of `unsafe.Pointer`, which would put unnecessary strain 
on the GC iirc, because the memory pointed to would be scanned 
conservatively (basically assuming everything in there could be a pointer). 
However, I realize now that I over-complicated the type def. I guess I 
should just store a pointer to the first element lik you suggest, but not 
as an unsafe.Pointer:
type BitSlice {
  data *uint64
  len int
  cap int
}
That surely doesn't break any rules as a data type, and I guess there is no 
chance the GC will start playing games with the underlying array any time 
soon.
 

> It does also mean, however, that you have to very carefully and tediously 
> re-implement a bunch of language primitives using unsafe

This is actually relatively straightforward and mostly unavoidable, since I 
already need to do those checks to properly panic when someone tries to 
access bits padding bits if the BitSlice has a non-multiple of 64 length.
It'll boil down to something like `if uint(i) >= uint(b.len) { panic(...) 
}` in most cases, which isn't all that bad.

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

Reply via email to