答えて
任意のデータ型の有用性は解決された問題で、問題を解決するために使用される方法に依存します。データ型が問題に適合しない場合は、問題に適合しないだけで、それ以上のことはありません。
Goプログラミング言語(他のほとんどのプログラミング言語と同様)は、簡略のルールに基づいており、プログラマが新しいデータ型を構築するために使用できます。これらの規則のいくつかは、次のとおり
*T
:TS- の配列:成分 としてTを含む構造
[10]T
をTへのポインタである新しいデータ型を作成します- ...
struct { t T; u U ... }
プログラマは、これらの単純なルールを作成することによって複雑なデータ型を作成できます。可能なデータ型の総数は、有用なデータ型の数を超えています。明らかに、有用ではないデータ型が存在する(存在しなければならない)。これは、新しいデータ型を構築するためのルールが単純であるという事実の自然な結果です。
タイプ**T
は、プログラムに表示される可能性が低いタイプのカテゴリに分類されます。 *****T
を書くことが可能であるという事実は、そのようなタイプが非常に有用でなければならないことを意味するものではない。
そして最後に、あなたの質問への答え:
はタイプ**T
は通常、我々はタイプT
の別の値にタイプT
の値のユーザーをリダイレクトするコンテキストで表示されますが、用値のすべてのユーザーにアクセスできない、またはユーザーを見つけることに時間がかかるような何らかの理由があります。
- の値はコピーしませんは
- (何らかの理由で)私たちは、私たちはすぐに別の値にタイプ
T
の特定の値のすべてユーザーをリダイレクトにしたい - ポインタを経由して値にアクセスするタイプ
T
の値のすべてのユーザーが欲しいですそのような状況では
それは(1)私たちはOで3ステップを実施することを可能にするため、**T
を使用することは自然である:
type User_of_T struct {
Value **T
}
// Redirect all users of a particular value of type T
// to another value of type T.
func (u *User_of_T) Redirect(t *T) {
*(u.Value) = t
}
それはしかし、スマートな解決策です。 – Tarik
Cではポインタへのポインタはかなり一般的です。例えば:
- 複数次元アレイ(例えば、文字列の配列、
char** argv
はここで最も顕著な例であるかもしれない)出力パラメータゴーで
として
**int
のように表示されません。 ただし、2番目の例は、Goプログラムにも適用されます。たとえば、パラメータとして渡されたポインタを変更できる関数があるとします。その場合、元のポインタを変更できるように、そのポインタへのポインタを渡す必要があります。関数はある値(しばしばある種のエラーコード)を返すだけで、追加のポインタを返す必要がある場合は、そのポインタへのポインタを出力パラメータとして使用する必要があるため、Cでは非常に一般的です。しかし、Goの関数は複数の値を返すことができるので、ポインタへのポインタの出現もまれです。しかし、それらはまだ有用であり、場合によってはより良いAPIにつながるかもしれません。
例えば、atomic.StorePointer関数は、標準ライブラリのポインタへのポインタのための稀ではあるが、よく隠されたユースケースの1つです。
関数へのポインタを渡すと、関数はコピーを取得します。だから、与えられたポインタに新しい値を元に、それを割り当てることにはなりません割り当てる:
type Smartphone struct {
name string
}
type Geek struct {
smartphone *Smartphone
}
func replaceByNG(s **Smartphone) {
*s = &Smartphone{"Galaxy Nexus"}
}
func replaceByIPhone(s *Smartphone) {
s = &Smartphone{"IPhone 4S"}
}
func main() {
geek := Geek{&Smartphone{"Nexus S"}}
println(geek.smartphone.name)
replaceByIPhone(geek.smartphone)
println(geek.smartphone.name)
replaceByNG(&geek.smartphone)
println(geek.smartphone.name)
}
出力は次のようになります。ここでは
Nexus S
Nexus S
Galaxy Nexus
本当に便利な答えは、これは私が別の関数でスライスを修正しようとしたことです –
は、標準ライブラリに**権利を含む例です。
http://code.google.com/p/go/source/browse/src/pkg/encoding/gob/decoder.go#23
Linus Torvalds氏は、最近のポインタへのポインタは(Cで)良い味とコーディングにつながる方法を述べました。 (とりわけ)Brian Barto's blog postを参照してください。
- 1. ポインタへのポインタを使用するポイントは何ですか?
- 2. ctypesのLP_ *ポインタと* _pポインタの違いは何ですか?
- 3. 生ポインタと弱ポインタの違いは何ですか?
- 4. ポインタをポインタにキャストしています...ポインタですか?
- 5. C、ポインタ(またはポインタへのポインタ?)、**、malloc
- 6. C++でvoidポインタとは何ですか?
- 7. 合成ポインタとは何ですか?
- 8. ファイル位置ポインタとは何ですか?
- 9. 'this'ポインタとは何ですか?
- 10. 静的ポインタは強いポインタですか?
- 11. golang gobはポインタを0からnilポインタに変換します
- 12. 何度も何度も...ポインタ
- 13. C++では "*(ポインタ+整数)"は何をしますか?
- 14. ポインタを削除してポインタをNULLに設定する違いは何ですか?
- 15. は、リンクリストに「ポインタ」と「ポインタへのポインタ」の使用に混乱
- 16. ポインタがポインタにない場合のポインタへのポインタの衝突
- 17. これはvoidポインタですか?鋳造?何してるの?
- 18. 関数内でポインタのポインタを使用する正しい方法は何ですか?
- 19. QObjectポインタを使用した後でQObjectポインタを削除しますか?
- 20. C++ 11/14ユニークなポインタではないユニークなポインタですか?
- 21. ポインタの正しい無効な値は何でしょうか?
- 22. マルチマップでのポインタとしてのポインタ
- 23. Doポインタはコンパイラの最適化を阻害しますか?
- 24. ポインタへのポインタ?
- 25. ポインタと.netポインタ
- 26. ポインタ?ポインタ関数?
- 27. ポインタへのポインタ
- 28. ポインタとポインタが
- 29. C++でのポインタの割り当て。 (ポインタへのポインタへのポインタはLHS上にあります)
- 30. ポインタへのポインタで行列を初期化しますか?
任意のデータへのポインタが便利です。ポインタはデータです。ポインターへのポインターは便利であり、ポインターへのポインターへのポインターもあります。 –
私は同意しますが、ポインターの算術もポインタもGoのポインターよりも何もしていないので、実際には無用です。 – thwd
Goにはポインタ演算があります。 'unsafe'パッケージを使って自由に使える' uintptr'を得ることができます。場合によっては、この方法でコードを効率的にすることもできますが、一般的には避けるべきです。 – tux21b