将C数组和指针代码转换为Go

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
    }
}