Go での配列へのポインタの使用
C では、ポインタを介して配列にアクセスするのは基本的なテクニックです。ただし、Go では、スライスを扱うときのこの操作に関していくつかのあいまいさがあるようです。詳細を詳しく見てみましょう。
配列へのポインタを受け取る次の C スタイル関数を考えてみましょう。
void conv(int *x, int xlen, int *h, int hlen, int **y) { for (int i = 0; i < xlen; i++) { for (int j = 0; j < hlen; j++) { *(*y)[i + j] += x[i] * h[j]; } } }
ただし、Go では、配列へのポインタにアクセスしようとします。 y も同様にコンパイラ エラーになります。
func conv(x []int, xlen int, h []int, hlen int, y *[]int) { for i := 0; i < xlen; i++ { for j := 0; j < hlen; j++ { *y[i+j] += x[i] * h[j] } } }
エラー メッセージは、y[i j] であることを示します。は *[]int 型のインデックスであり、無効です。
配列とスライスの受け渡し
この問題の解決策は、配列とスライスの性質を理解することにあります。囲碁で。 Go のドキュメントによると、配列を関数に渡すときは、通常、配列へのポインタではなくスライス (配列への参照) を渡す方が良いとされています。
代わりにスライスを使用する
スライスを使用して conv 関数を書き直すには、次のように []int のスライスを渡すだけです。例:
func conv(x []int, xlen int, h []int, hlen int, y []int) { for i := 0; i < xlen; i++ { for j := 0; j < hlen; j++ { y[i+j] += x[i] * h[j] } } }
この場合、y は通常のスライスであり、その要素へのアクセスは簡単です。
結論
コンセプトは配列へのポインターを使用することは C では一般的ですが、Go では通常推奨されません。代わりに、スライスを渡すことにより、Go 関数で配列を参照するためのより効率的かつ慣用的な方法が提供されます。
以上が配列へのポインタは C と Go でどのように異なりますか? Go で推奨されるアプローチは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。