ホームページ  >  記事  >  バックエンド開発  >  golang にはポインタがありますか?

golang にはポインタがありますか?

青灯夜游
青灯夜游オリジナル
2022-11-23 10:43:332132ブラウズ

Golang にはポインタがあります。 Go 言語は、プログラマにデータ構造ポインタを制御する機能を提供します。そのポインタのサポートは、Java 言語と C/C 言語の間です。Java のようにポインタを直接操作するコードの機能をキャンセルしたり、問題を解決したりすることはありません。 C/C でのポインタの乱用によって引き起こされるセキュリティと信頼性の問題。ポインターは Go 言語の 2 つの中心的な概念に分割できます: 1. このポインター型のデータを変更できるようにする型ポインター; 2. 開始要素を指す元のポインターと要素の数で構成されるスライス、そして容量。

golang にはポインタがありますか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Java や .NET などのプログラミング言語とは異なり、Go 言語はプログラマにデータ構造ポインターを制御する機能を提供しますが、ポインター操作を実行することはできません。 Go 言語を使用すると、特定のコレクションのデータ構造、割り当て数、メモリ アクセス パターンを制御できます。これは、適切に機能するシステムを構築するために非常に重要です。ポインタがパフォーマンスに与える影響は自明であり、システム プログラミング、オペレーティング システム、またはネットワーク アプリケーションを実行する場合、ポインタは不可欠な要素です。

Go 言語のポインターのサポートは、Java 言語と C/C 言語の間にあります。Java のようにポインターを直接操作するコードの機能がキャンセルされることも、C/C でのポインターの操作が回避されることもありません。 . ポインタの誤用によって引き起こされるセキュリティと信頼性の問題。

ポインタ (ポインタ) は、Go 言語の 2 つの中心的な概念に分割できます。

  • 型ポインタ。このポインタ型を変更できるようにします。データをコピーすることなく、ポインタを直接使用してデータを転送できますが、型ポインタはオフセットや演算を実行できません。

  • スライスは、開始要素への元のポインタ、要素の数、および容量で構成されます。

このような制約と分割の恩恵を受けて、Go 言語のポインター型変数は、ポインター オフセットなしで効率的にポインターにアクセスできるという特性を備えているため、重要性の不正な変更が回避されます。同時に、ガベージ コレクションにより、オフセットされないポインターの取得とリサイクルが容易になります。

スライスには生のポインターよりも強力な機能があり、より安全です。スライスが範囲外になると、ランタイムはクラッシュを報告してスタックをポップアップしますが、元のポインターは折りたたまれるだけです。

golang のポインタとは何ですか?

ポインタは、その値が別の変数のアドレス、つまりメモリ位置の直接アドレスである変数です。変数や定数と同様に、ポインタを使用して変数のアドレスを格納するには、その前に宣言する必要があります。ポインタ変数宣言の一般的な形式は次のとおりです:

var var-name *var-type

ここで、var-type はポインタの基本型です。有効な Go データ型である必要があり、var-name はポインタ変数の名前です。 。ポインターの宣言に使用されるアスタリスク (*) は、乗算に使用されるアスタリスクと同じです。ただし、このステートメントでは、変数をポインターとして指定するためにアスタリスク (*) が使用されています。以下は有効なポインタ宣言です:

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

すべてのポインタの値の実際のデータ型 (整数、浮動小数点、またはその他のデータ型) は同じであり、メモリの長い 16 進数を表します。住所 。異なるデータ型のポインター間の唯一の違いは、ポインターが指す変数または定数のデータ型です。 [関連する推奨事項: Go ビデオ チュートリアル ]

ポインターの使用方法

ポインターを使用して非常に頻繁に実装される重要な操作がいくつかあります。

  • ポインタ変数を定義する

  • 変数のアドレスをポインタに代入する

  • 最後にポインタ変数

で使用可能なアドレスの値にアクセスします。これは、単項演算子

# を使用して、指定されたアドレスにある変数の値を返すことによって行われます。オペランドによって。次の例では、これらの操作を使用します。

package main

import "fmt"

func main() {
   var a int= 20   /* actual variable declaration */
   var ip *int        /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

上記のコードをコンパイルして実行すると、次の結果が生成されます。

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20
Go の nil ポインター

Go コンパイラは、ポインターに正確なアドレスが割り当てられていない場合に備えて、ポインター変数に Nil 値を割り当てます。これは変数が宣言されるときに行われます。 nil

値として指定されたポインタを nil ポインタと呼びます。

nil

ポインタは、いくつかの標準ライブラリで定義されているゼロ値の定数です。次のプログラムを参照してください:

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

上記のコードをコンパイルして実行すると、次の結果が生成されます:

The value of ptr is 0
ほとんどのオペレーティング システムでは、プログラムはアドレス ## にアクセスできません。 #0 のメモリ。これは、このメモリがオペレーティング システムによって予約されているためです。ただし、メモリ アドレス 0 には特別な意味があり、ポインタがアクセス可能なメモリ位置を指すことを意図していないことを示します。ただし、慣例により、ポインターに nil (ゼロ) 値が含まれている場合、そのポインターは何も指していないものとみなされます。

これが nil ポインターであるかどうかを確認するには、以下に示すように if ステートメントを使用できます。

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

プログラミング関連の知識の詳細については、 プログラミングビデオにアクセスしてください! !

以上がgolang にはポインタがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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