我试图在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吗?
答案 0 :(得分:2)
您希望切片r
和a
,您可以通过以下方式进行切片:
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
}
}