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

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

Jun 01, 2023 am 09:12 AM
言語を移動 参照型 値の型

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

SQL.Openを使用するとき、DSNが空に渡されたときにエラーを報告しないのはなぜですか? SQL.Openを使用するとき、DSNが空に渡されたときにエラーを報告しないのはなぜですか? Apr 02, 2025 pm 12:54 PM

SQL.Openを使用する場合、DSNがエラーを報告しないのはなぜですか? GO言語では、sql.open ...

See all articles