2017-08-06 152 views
1

我試圖在Go中重寫C代碼,並且我注意到我嘗試重寫的代碼遵循很多常見模式。許多函數接受unsigned char數組,作爲指針傳遞,無論是在調用函數還是在函數的某些其他部分,我們都會爲指針添加一些值,如同算術一樣。這是一個簡單的示例,僅用於演示目的。將C數組和指針代碼轉換爲Go

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精確地轉換爲Go中的範圍/索引的算術。我結束了這樣的事情:

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

你有數組的指針,而不是在使用索引。你得到的是對索引訪問的邊界檢查。這使得您的Go程序比C代碼更安全,但速度也更慢。您也可以使用切片,這可以使您的代碼更具可讀性。 – chmike

回答

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

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