I'm trying to rewrite a C code in Go, and what I notice is that the code that I try to rewrite follows a lot one common pattern. Many of the functions accept unsigned char
arrays, passed as pointer, and either when calling the functions or at some other part of the function we add some value to the char
pointer, as doing arithmetic. Here is a simple example just for demonstration purposes.
static void func1(unsigned char *r) {
int i;
for (i = 0; i < CONSTANT; i++)
func2(r + i * OTHER_CONSTANT);
}
static void func2(const unsigned char *a) {
unsigned int i;
for (i = 0; i < CONSTANT; i += 8) {
// do some stuff
a += 3;
}
}
What is a proper way to convert something like this to Go? I started to use byte
slices in order to represent the char
arrays, but I don't know how to exactly transfer those arithmetic expression with char
into arithmetic with ranges/indexes in Go. I ended up having something like this:
func func1(r []byte) {
for i := 0; i < CONSTANT; i++ {
func2(r + i*OTHER_CONSTANT) // This just doesn't work
}
}
func func2(a []byte) {
for i := 0; i < CONSTANT; i += 8 {
// do some stuff
a += 3 // This doesn't work
}
}
Any idea how to convert something like above from C to Go?
You want to be slicing r
and a
, which you can do in the following way:
func func1(r []byte) {
for i := 0; i < CONSTANT; i++ {
func2(r[i*OTHER_CONSTANT:])
}
}
func func2(a []byte) {
for i := 0; i < CONSTANT; i += 8 {
// do some stuff
a = a[3:]
}
}
Go does not have pointer arithmetic:
https://golang.org/doc/faq#no_pointer_arithmetic
So you should just work with indexes that point to positions on the array, and slices to get parts of the array:
func func1(r []byte) {
rIndex := 0
for i := 0; i < CONSTANT; i++ {
func2(r[rIndex + i*OTHER_CONSTANT:])
}
}
And:
func func2(a []byte) {
aIndex := 0
for i := 0; i < CONSTANT; i += 8 {
// do some stuff
aIndex += 3
// use a[aIndex] when needed
}
}