ホームページ  >  記事  >  バックエンド開発  >  Golang配列転送の詳しい説明

Golang配列転送の詳しい説明

藏色散人
藏色散人転載
2020-11-23 14:59:363937ブラウズ

次のコラム golang チュートリアル では、Golang 配列の受け渡しについて紹介します。困っている友人の役に立てば幸いです。

Golang配列転送の詳しい説明

Golang 配列の転送の詳細な説明

今日は、Golang 配列の転送の詳細な説明を共有します。とても良い内容だと思いますので、皆さんと共有したいと思います。非常に参考になる内容です。必要な方は編集者をフォローしてご覧ください。

# # 概念の紹介

配列とスライス##配列とは、同じ一意の型のデータ項目の番号付きの固定長シーケンスです。配列長は最大2GBでバリュー型です。スライスは配列の連続したフラグメントへの参照であるため、スライスは参照型です。

値渡しと参照渡し

Go 言語で関数のパラメータを渡すには、値渡しと参照渡しの 2 つの方法があります。 Go はデフォルトで値渡しを使用してパラメーターを渡します。つまり、パラメーターのコピーを渡します。関数内でコピーの値が変更されても、元の変数は影響を受けません。

参照による受け渡しは、実際には「値による受け渡し」と呼ぶことができますが、コピーはアドレスのコピーであり、このコピーを通じて、この値が指すアドレスの値を変更できます。

Go 言語では、関数を呼び出すときに、参照型 (スライス、マップ、インターフェイス、チャネル) がデフォルトで参照によって渡されます。

配列を渡すことの欠点

一般に、特に配列が特に大きい場合、ポインタを渡す方がコピーを渡すよりもコストが低くなります。具体的な理由は次のとおりです。

値の転送には初期配列の完全なコピーが必要で、このコピーがスタックに置かれるため、実行時間が多くかかるため、値の転送効率が比較的低くなります。

初期配列のコピーには、追加のメモリ領域 (スタック上のメモリ) が必要です。

コンパイラは、初期配列をコピーするためのコードの一部を具体的に生成する必要があります。もっと大きい。

回避方法

上で紹介したように、2 つの方法があります。1 つ目はポインターを使用する、つまり参照渡しです。2 つ目はスライスを使用します。スライスは参照です。デフォルトで参照によって渡されるタイプです。

ポインタを使用して渡す

package main
import "fmt"
func main() {
  var arr = [5]int{1, 2, 3, 4, 5}
  fmt.Println(sum(&arr))
}
func sum(arr *[5]int) int {
  s := 0
  for i := 0; i < len(arr); i++ {
    s += arr[i]
  }
  return s
}

スライスを使用して渡す

package main
import "fmt"
func main() {
  var arr = [5]int{1, 2, 3, 4, 5}
  fmt.Println(sum(arr[:]))
}
func sum(arr []int) int {
  s := 0
  for i := 0; i < len(arr); i++ {
    s += arr[i]
  }
  return s
}
通常は最後の方法がより一般的です。

以上がGolang配列転送の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はzzvips.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。