では、なぜ Golang にはポインタが必要なのでしょうか?この種のポインタにはどのようなユニークな用途があるでしょうか? (推奨学習: Go )
## 型言語の引用を学習するときは、常にそれを理解する必要があります。渡す関数/メソッドを指定するとき、それは値ですか、それとも参照。 実際、ほとんどの参照言語では、パラメーターが基本型の場合、渡されるパラメーターのほとんどは値です。つまり、パラメーターの別のコピーが現在の関数呼び出しスタックにコピーされます。パラメータが高度なタイプの場合、基本的にすべての参照が渡されます。これは主に、仮想マシンのメモリ管理が原因で発生します。 メモリ管理におけるメモリ領域には通常、ヒープとスタックが含まれます。スタックは主に、現在の呼び出しスタックで使用される単純な型データ (string、boolean、int、float など) を格納するために使用されます。 これらのタイプのメモリは占有量が少なく、リサイクルが簡単です。基本的に、それらの値はポインタが占有する領域に似ているため、直接コピーでき、GC が容易です。ターゲットを絞った最適化を実行します。複雑な高度な型は、比較的大量のメモリを占有し、ヒープに格納される傾向があります。GC リサイクルの頻度は比較的低く、コストが高くなります。そのため、参照/ポインタを渡すことで、より高いメモリの使用を回避できます。 -コスト操作: 操作をコピーし、メモリを節約し、プログラムの実行効率を向上させます。
したがって、次の状況ではポインタの使用を検討できます: 1. パラメータの値を変更する必要がある; 2. コピー操作を回避する; 3. メモリを節約する; Golangでは特にstruct、slice、mapなどのAdvanced型も異なります。実は少し複雑なのはstructの使い方だけで、slice、map、chanは値かポインタかを意識せずにそのまま使うことができます。Go にはポインターがありますが、ポインター演算はありません。ポインター変数を使用して文字列のバイトを反復処理することはできません。 Go で関数を呼び出すときは、変数が値によって渡されることに注意してください。
ポインタ ' * ' に type: var p * int というプレフィックスを付けて定義します。ここで、 p は整数値へのポインタです。新しく定義されたすべての変数にはその型のゼロ値が割り当てられ、ポインターについても同様です。新しく定義されたポインタまたは何も指していないポインタの値は nil です。 他の言語では、これは NULL ポインターと呼ばれることがよくありますが、Go では nil です。ポインタが何かを指すようにするには、次のようにアドレス演算子 (&) を使用できます:package main import "fmt" func main() { var p *int fmt.Printf("%v\n",p) //← 打印 nil var i int //← 定义一个整形变量 i p = &i //← 使得 p 指向 i, 获取 i 的地址 fmt.Printf("%v\n",p) //打印内存地址 *p = 6 fmt.Printf("%v\n",*p) //打印6 fmt.Printf("%v\n",i) //打印6 }前述したように、ポインタ演算はありません。そのため、次のように記述すると: *p という意味になります。 (*p) : まずポインタが指す値を取得し、この値に 1 を加算します。ここでC言語との違いに注意してください。 Go 言語の場合、厳密に言えば、値による転送は 1 種類のみです。変数がパラメーターとして渡されると、変数のコピーが作成され、関数またはメソッドに渡されます。このコピーのアドレスは変数のアドレスとは異なることがわかります。 変数がポインタとして渡されると、その変数が指す同じメモリ アドレスを指す新しいポインタが作成されるため、このポインタは元の変数ポインタのコピーと考えることができます。 このように理解すると、Go は常にコピーを作成し、それを値で転送しますが、このコピーは変数のコピーである場合もあれば、変数ポインタのコピーである場合もあります。
以上がなぜ GOLANG にはまだポインタがあるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。