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

时间:2017-08-06 22:44:51

标签: c arrays pointers go

我试图在Go中重写一个C代码,我注意到我尝试重写的代码遵循了很多常见模式。许多函数接受unsigned char数组,作为指针传递,并且在调用函数时或者在函数的其他部分我们向char指针添加一些值,就像算术一样。这是一个简单的例子,仅用于演示目的。

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

将此类内容转换为Go的正确方法是什么?我开始使用byte切片来表示char数组,但我不知道如何将这些算术表达式与char精确地转换为带有范围/索引的算术走。我最终得到了这样的东西:

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

知道如何将上述内容从C转换为Go吗?

2 个答案:

答案 0 :(得分:2)

您希望切片ra,您可以通过以下方式进行切片:

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

答案 1 :(得分:1)

Go没有指针算术:

https://golang.org/doc/faq#no_pointer_arithmetic

所以你应该只使用指向数组上位置的索引,并使用切片来获取数组的一部分:

func func1(r []byte) {
    rIndex := 0
    for i := 0; i < CONSTANT; i++ {
        func2(r[rIndex + i*OTHER_CONSTANT:])
    }
}

func func2(a []byte) {
    aIndex := 0
    for i := 0; i < CONSTANT; i += 8 {
        // do some stuff
        aIndex += 3
        // use a[aIndex] when needed
    }
}