2017-08-06 14 views
1

私はGoでCコードを書き直そうとしていますが、書き換えようとしているコードは多くの共通パターンに従っています。関数の多くはunsigned charの配列を受け入れ、ポインタとして渡されます。関数を呼び出すときや、関数の他の部分で、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に変換する適切な方法はありますか? charの配列を表現するためにbyteスライスを使い始めましたが、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 
    } 
} 
関連する問題