この記事は、go language チュートリアルコラムで、Go ポインター (Go Pointer) がどのような状況で使用されるのかを紹介するものです。 !
GOコードでのポインターの使用は、特に使用法のシナリオを区別するのが困難な場合、初心者にはそれほど友好的ではありません。
ポインターを使用する際の最大の誤解の 1 つは、Go のポインターが C 言語のポインターに非常に似ているということだと思います。しかし、そうではありません。 Go では、ポインタは C/C と同じように機能しません。
この記事では、Go ポインターを正しく使用する方法について説明します。
間違った結論: ポインターを使用する方が良いでしょうか?
一般に、ポインターを使用すると常に値をコピーする必要がなくなるため、アプリケーションの実行が高速になると考えられています。 Go でも同じ考えがあるのは不思議ではありません。
ただし、Go での ポインターの受け渡しは、通常、値の受け渡し よりも遅くなります。これは、Go がガベージ コレクション言語であることの結果です。関数へのポインタを渡すとき、Go はエスケープ解析を実行して、変数をヒープに格納するかスタックに格納するかを決定する必要があります。これによりすでに余分なオーバーヘッドが追加されていますが、それ以外の場合は変数をヒープに保存できます。変数をヒープに保存すると、GC の実行中に時間もロスします。
Go の便利な機能は、コマンド go build -gcflags="-m"
を実行することで、エスケープ解析がどのように行われたかを確認できることです。これを行うと、Go は変数がヒープにエスケープするかどうかを教えてくれます:
./main.go:44:20: greet ... argument does not escape ./main.go:44:21: greeting escapes to heap ./main.go:44:21: name escapes to heap
変数がヒープにエスケープしない場合、変数はスタック上に残ります。スタックは変数をクリアするためにガベージ コレクターを必要とせず、push/pop
操作のみを実行します。
コンテンツが値によって渡される場合、そのコンテンツは常にスタック上で処理されるため、ガベージ コレクションのオーバーヘッドは発生しません。 (GC はデフォルトで実行されます。ヒープ内のコンテンツが少ないということは、GC が行うべき作業が少ないことを意味します)。
ポインターを使用するとパフォーマンスが低下することがわかりました。必要な場合はポインターを使用しますか?
大規模なデータ構造のコピーポインタのパフォーマンスは常に値の転送より悪いのでしょうか?明らかにそうではありません。大規模なデータ構造を扱う場合、ポインタが役に立ちます。これにより、ガベージ コレクションのコストが大量のデータのコピーのコストで相殺される可能性があります。 これについて話すと、「そのビッグデータはどのくらいの大きさにすべきですか?」といつも尋ねられます。 ここに固定値はないと思いますが、パフォーマンスに関連するものはすべてベンチマークする必要があります。 Go には強力なベンチマーク ツールが組み込まれており、これを最大限に活用できます。変数関数のパラメーターを変更する唯一の方法は、ポインターを渡すことです。デフォルトでは、値の変更はコピーに対して実行されます。したがって、これらの変更は、それを呼び出す関数に反映できません。 次のコードを見てください:type person struct { name string }func main() { p := person{"Richard"} rename(p) fmt.Println(p) }func rename(p person) { p.name = "test" }person への変更はそのコピーに対して実行されるため、出力は
Richard になります。基になる人物オブジェクトの値を変更する場合は、ポインターを使用する必要があります。
func main() { p := person{"Richard"} rename(&p) fmt.Println(p) }func rename(p *person) { p.name = "test" }上記と同様に、
testを出力します。可変性とは、Go でポインターが使用される状況です。これが良いことなのかどうかは議論の余地がある。
func (p *person) rename(s string) { p.name = s }func (p *person) printName() { fmt.Println(p.name) }は
func (p *person) rename(s string) { p.name = s }func (p person) printName() { fmt.Println(p.name) }よりも優れていますが、一貫性のために
printName でポインターを使用する必要はありません。ただし、これにより API が簡素化され、参照が必要な場所を正確に覚えておく必要がなくなります。
nil ポインターであり、値が設定されていないことを意味します。この要件は、次のように実装することもできます。
type exam struct { score int present bool }別の
present フィールドを使用して、学生が試験を受けなかったことを示します。
Go では可能な限りデフォルト値を使用することが合理的であると考えています。これはすべての状況で機能するわけではありませんが、私の場合は大きな事故を防ぐことができました。ポインターの代わりに値を使用すると、NULL ポインターによるトニー・ホアの「100 万ドルの間違い」は発生しません。
デフォルト値のゼロは、多数の宣言を避けるのに役立ちます。
另一个好处是易变性造成的问题比它解决的问题多的得多。易变性给函数带来的副作用同时使得调试变得更加困难。 通过让函数返回修改之后的结构体,可以避免这种突变。
重写之前的例子
func main() { p := person{"richard"} p = rename(p) fmt.Println(p) }func rename(p person) person { p.name = "test" return p }
这也是 append
如何工作的,所以并不陌生。
x := []int{1,2} x = append(x, 3) x = append(x, 4)
鉴于指针的安全性,和值处理比指针处理更快,使用指针需要反复斟酌。
原文地址:https://medium.com/@meeusdylan/when-to-use-pointers-in-go-44c15fe04eac
译文地址:https://learnku.com/go/t/60923
以上がGo ポインターをいつ使用するか知っていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

goooffersbustfeaturesforsecurecoding、butdevelopersmustimplementsecuritybestpracticive.1)usego'scryptageforsecuredathing.2)surncurrencywithranciationwithranizationprimitivestopreventraceconditions.3)sanitexe zeexerinputeterinpuptoravoidsqlinj

Goのエラーインターフェイスは、TypeErrorInterface {error()String}として定義され、エラー()メソッドを実装する任意のタイプをエラーと見なすことができます。使用の手順は次のとおりです。1。iferr!= nil {log.printf( "anerroroccurred:%v"、err)return}などのエラーを基本的にチェックおよびログエラー。 2。TypeMyErrorStruct {MSGSTRINGDETAILSTRING}などのより多くの情報を提供するカスタムエラータイプを作成します。 3.エラーラッパー(GO1.13以降)を使用して、元のエラーメッセージを失うことなくコンテキストを追加する、

Effectivitive Handleerrorsinconconconcurentgoprograms、usechannelstocommunicateerrors、Implienterrorwatchers、Sunidertimeouts、usebufferedchannels、およびprovideclearerrormess.1)usechannelstopasserrors fromgoroutineStothemainctunction.2)Anerrorwatcherを実装します

GO言語では、インターフェイスの実装が暗黙的に実行されます。 1)暗黙的な実装:タイプにインターフェイスによって定義されたすべてのメソッドが含まれている限り、インターフェイスは自動的に満たされます。 2)空のインターフェイス:すべてのタイプのインターフェイス{}タイプが実装されており、中程度の使用はタイプの安全性の問題を回避できます。 3)インターフェイス分離:コードの保守性と再利用性を向上させるために、小型ではあるが焦点を絞ったインターフェイスを設計します。 4)テスト:インターフェイスは、依存関係をあざけることでユニットテストに役立ちます。 5)エラー処理:エラーは、インターフェイスを介して均一に処理できます。

go'sinterfacesAriemplictlictlictlymentedは、Javaandc#とは異なり、whorequireexplicitimplementation.1)ingo、anytypewithedsodsodsautodsodsodsodsodsodsodsodsodsodsodsodsodsimplication antersface、促進性と柔軟性

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

開発者は、次のベストプラクティスに従う必要があります。1。ゴルチンを慎重に管理して、リソースの漏れを防ぎます。 2。同期にチャネルを使用しますが、過剰使用を避けます。 3。同時プログラムのエラーを明示的に処理します。 4. GomaxProcsを理解して、パフォーマンスを最適化します。これらのプラクティスは、リソースの効果的な管理、適切な同期の実装、適切なエラー処理、パフォーマンスの最適化を確保し、それによりソフトウェアの効率と保守性を向上させるため、効率的で堅牢なソフトウェア開発には重要です。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版
ビジュアル Web 開発ツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ホットトピック









