2016-07-03 8 views
-2

私はGolangで新しく、私はhttp://tour.golang.org/をやっています。誰も私を説明することができます行1,3,5と7この機能は特に '*'と '&'は何ですか?関数宣言の中で言及することによって、彼らは何を想定/予期しているのでしょうか?おもちゃの例:ゴランの「*」と「&」の意味は?

1: func intial1(var1 int, var2 int, func1.newfunc[]) *callproperfunction { 
2: 
3: addition:= make ([] add1, var1) 
4: for i:=1;i<var2;i++ { 
5: var2 [i] = *addtother (randomstring(lengthofcurrent)) 
6: } 
7: return &callproperfunction {var1 int, var2 int, func1.newfunc[], jackpot} 
8: } 

彼らが我々はC++で持っているもののようなポインタであるようです。しかし、私はそれらの概念をここにあるものに結びつけることはできません。言い換えれば、Goの関数宣言で '*'と '&'を使用するとどうなりますか。

編集:私は参照と参照の意味を知っています。私が理解できないのは、関数へのポインタをGolangとすることです。例えば1行目と7行目のように、これらの2行は何をしていますか?ポインタを返すintial1という名前の関数を宣言しましたか? 7行目ではreturn関数を使って引数を呼びます。

+2

私たちがC++で持っているような_are_ポインタです。 – tkausl

+1

これらはポインタです。ポインタの詳細については、https://www.golang-book.com/books/intro/8 をご覧ください。 – turhanco

+0

@turhanco、私は彼らが指摘していることを知っています。例えば、5行目と7行目はどうしますか?それらは関数ではありません変数です。 – David

答えて

6

これらのは、私たちがC++で持っているようなポインターです。

違いは次のとおりです。

  • 代わりの->ポインタ、あなた常に使用.、すなわちpointer.method()上のメソッドを呼び出します。

  • ダングリングポインタはありません。ローカル変数へのポインタを返すことは完全に有効です。 Golangはオブジェクトの存続期間を保証し、不要になったときにオブジェクトをガベージコレクトします。

  • ポインタはnew()またはオブジェクトobject{}を作成し、&でそれのアドレスを取ることによって作成することができます。

  • Golangでは、ポインタ演算(配列はポインタに崩壊しない)と安全でないキャストはできません。すべてのダウンキャストは、変数のランタイム型を使用してチェックされ、panicのいずれかです。インスタンスが間違った型の場合は、2番目の戻り値の型を取るかどうかによって2番目の戻り値としてfalseを返します。

+0

を参照してください。デフォルトでは、Goは互換性のない型間でポインタの算術演算やキャスト(型変換)を許可しません。そして私は、GoのポインタはJava/C#のポインタの方がC++のポインタよりも似ていると言います。 – creker

+0

Goには型変換がありません。 – kostix

+0

(Goポインタの最も近い比較ポイントはC#ValueTypeポインタです)JavaとC#_object_参照は、仮想メソッドのような追加機能とオブジェクトヘッダーのような追加機能も追加します。 – twotwotwo

3

あなたの質問はあまりよくうまく一致しませんが、私は簡単にしようとします。

整数5を保持する変数pとポインタとなるpという別の変数があるとしましょう。 *と&がゲームに参加する場所です。

これらを使用して変数を出力すると、異なる出力が生成される可能性があります。そのため、すべて状況や使用状況によって異なります。 *と&を使用すると、小さなプロジェクトでは問題ではないコード行()を節約し、コードをより美しく/可読にすることができます。

&は、の次の変数のメモリアドレスを返します。 *リターン/

var a = 5 
p = &a // p holds variable a memory address 
fmt.Printf("Address of var a: %p\n", p) 
fmt.Printf("Value of var a: %v\n", *p) 

// Let's change a value (using the initial variable or the pointer) 
*p = 3 // using pointer 
a = 3 // using initial var 

fmt.Printf("Address of var a: %p\n", p) 
fmt.Printf("Value of var a: %v\n", *p) 
を(あなたは、コンピュータのRAMをアクセスしているので、変な出力と、おそらく問題を取得したい場合を除き、変数のメモリアドレスを保持する必要があります)、次の変数の値に等しいです

*と&を使用しているときは、*はあなたが指している変数の値を設定するためのものであり、&はあなたが指し示す変数のアドレスです。

この回答が役立ちます。