ホームページ  >  記事  >  バックエンド開発  >  Go 言語の参照データ型と値のデータ型

Go 言語の参照データ型と値のデータ型

PHPz
PHPzオリジナル
2023-06-01 09:12:11748ブラウズ

Go 言語は厳密に型指定された言語であり、データ型は参照データ型と値データ型の 2 つの型に分類できます。参照データ型と値データ型は使用方法が若干異なりますので、これら 2 つのデータ型について詳しく見てみましょう。

1. 参照データ型

Go 言語の参照データ型には、スライス、マップ、チャネル、インターフェイス、ポインターが含まれます。参照データ型の場合、変数の値はそれ自体の値ではなく、メモリ アドレスへのポインタです。したがって、参照型の変数を宣言すると、その変数にメモリ アドレスが割り当てられてスタックに格納され、メモリ アドレスが指す空間がヒープに格納されます。

  1. スライス

スライスは、必要に応じて自動的に拡大または縮小できる動的配列です。文字列スライスを例にとると、宣言と初期化は次のようになります。

var s1 []string //スライスを宣言します
s1 = make([]string, 3) //make を使用しますスライスを初期化する関数
s2 := []string{"foo", "bar", "baz"} // スライスを直接宣言して初期化します

Go 言語では、スライスは基礎となるデータへのポインタ。また、スライスの長さと容量も含まれます。これらは、len 関数と cap 関数によって返される値です。スライス内の要素の数が容量を超えると、Go 言語はより大きなメモリ領域を再割り当てし、元の要素を新しいメモリ領域にコピーします。

  1. マッピング

マッピングは、Go 言語の map キーワードを使用して定義される、キーと値のペアの順序なしのコレクションです。文字列マッピングを例にとると、宣言と初期化は次のとおりです。

m1 := make(map[string]int) // make 関数を使用してマッピングを初期化します
m2 := map [string]int{" foo": 1, "bar": 2, "baz": 3} // マッピングを直接宣言して初期化する

Go 言語では、マッピングはへのポインタでもあります。基礎となるデータと、マッピング要素の数量も含まれます。マップ内の要素の数が基礎となるメモリ容量を超えると、Go 言語はより大きなメモリ空間を再割り当てします。

  1. Channel

Channel は、複数の Ctrip 間でデータを転送する方法です。Go 言語でチャネルを宣言するには、make 関数と <-operator を使用します。文字列チャネルを例にとると、宣言と初期化は次のようになります。

var ch1 chan string // チャネルを宣言します
ch1 = make(chan string) // make 関数を使用してチャネルを初期化します。 channel
ch2 := make(chan string, 3) // make関数を使用して、バッファリングされたチャネルを初期化します
ch1 <- "foo" // チャネルにデータを送信します
data := < -ch1 // チャネルからの読み取り データの取得

Go 言語では、チャネルは基礎となるデータへのポインタでもあり、チャネルの容量と現在の要素数も含まれます。チャネル内の要素の数が容量を超えると、Go 言語は現在の Ctrip をブロックし、他の Ctrip が要素を取り除くのを待ちます。

  1. インターフェース

インターフェースは、インターフェース メソッドのセットを定義するデータ型です。単純なインターフェイスを例に挙げると、宣言は次のようになります。

type Caller インターフェイス {
Call() bool
}

Go 言語では、インターフェイスも次のようになります。基礎となるデータへのポインタ。インターフェイスの実装時に構造体を指します。インターフェイス メソッドは実装操作によってコピーされないため、インターフェイスは値型よりも高速です。

  1. ポインタ

ポインタはメモリ アドレスを含む変数です。Go 言語でポインタを宣言および使用するには、& 演算子と * 演算子を使用します。文字列型変数へのポインタを例に挙げ、次のように宣言して使用します。

var p1 *string // ポインタを宣言
s1 := "foo"
p1 = &s1 / / ポインタを変更します 文字列変数のメモリ アドレスを指します
fmt.Println("s1:", s1, "p1:", *p1) // ポインタを介して文字列変数の値を取得します

Go言語ではポインタの指す変数を事前に宣言しておく必要がありますが、Go言語にはC言語のようなポインタ演算子がありません。

2. 値のデータ型

Go 言語の値のデータ型には、ブール、整数、浮動小数点、複素数、文字、文字列、配列が含まれます。値型の変数の場合、変数の値と変数自体がスタックに格納されます。

  1. ブール型

Go 言語ではブール型には true と false の 2 つの値しかありません。ブール型は 1 バイトしかないため、大量に使用するとメモリ フットプリントを効果的に削減できます。

  1. 整数型

Go言語の整数型は符号付き整数型と符号なし整数型に分けられ、符号付き整数型はint8、int16、int32、int64に分かれます。 . 、符号なし整数型は、uint8、uint16、uint32、および uint64 に分類されます。使用する場合は、int 型と uint 型のバイト幅が異なるプラットフォームでも同じであるため、できるだけ int 型と uint 型を使用することをお勧めします。

  1. 浮動小数点型

Go言語の浮動小数点型はfloat32型とfloat64型の2種類に分かれており、デフォルトはfloat64型です。使用する場合は、float32型よりも計算速度や精度が高いため、可能な限りfloat64型を使用することをお勧めします。

  1. 複素数型

複素数型は、Go 言語の complex64 型と complex128 型を使用して実数と虚数を表します。たとえば、complex64 型は、実数部と虚数部の両方が float32 型の複素数であることを示します。

  1. 文字型

Go言語では文字型はルーンで表され、ルーン型の範囲とint32型の識別は同じです。 Go 言語では、一重引用符を使用して文字を表すことができます。

  1. String

String は、Go 言語の読み取り専用の一連の文字です。Go 言語で文字列を表すには二重引用符が使用されます。 Go 言語の文字列は UTF-8 でエンコードされます。

  1. Array

Array は固定長のデータ型で、Go 言語の要素型と同じです。利用する場合は配列の長さと要素の型を事前に宣言する必要があります。

結論

Go言語では参照データ型と値データ型は若干異なりますが、比較すると値データ型はスタックに格納されていることが分かります。メモリ内の変数の位置は変化せず、時間の経過とともに変化します (ポインタ操作が使用されない場合)、参照データ型変数の値は、ヒープ内に割り当てられたメモリ アドレスを指すポインタです。実際の使用では、最適なパフォーマンスと効果を実現するために、参照データ型と値データ型を合理的に使用する必要があります。

以上がGo 言語の参照データ型と値のデータ型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。