1

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?

1
  • You have to use indexes in the array instead of pointers. What you get with this is boundary check of indexed access. This makes your Go program safer than the C code, though bit slower too. You may also use slices, which can make your code more readable. Commented Aug 7, 2017 at 8:12

2 Answers 2

2

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:]
    }
}
Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.