2016-11-13 6 views
-2

ポインタがメモリ内の場所を参照しています。実際には、すべてのメモリアドレスは、私が理解する限り、変数型とは独立して同じ型を持っています。異なるタイプのポインタの違いは何ですか?

異なるポインタタイプ(*int,*stringなど)を使用する代わりに、すべてのポインタタイプに1つのタイプ(var p pointer)しか使用できませんか?

異なるポインタタイプの違いは何ですか?

package main 

import "fmt" 

func main() { 
    i := 5 
    s := "abc" 

    var pi *int  // alternatively var pi pointer 
    var ps *string // alternatively var ps pointer 

    pi = &i 
    ps = &s 

    fmt.Printf("%p %p", pi, ps) // result is 0x1040e0f8 0x1040a120 
} 

答えて

2

Goのタイプシステムは、ポインタに関するメモリエラーを防ぐように設計されています。これにより、プログラマーはメモリ内のオブジェクトを操作するのに十分なコントロールを持つことができますが、重い持ち上げのガベージコレクタトップの警官のムードを可能にします。
ポインタタイプを手動でメモリに変換して変換する必要がある場合は、unsafe packageを使用できます。

+0

ありがとうございます。しかし、私の情報が不足しているため、この説明は私には遠いです。ポインタは、32ビットまたは64ビットintとして表されるメモリへの参照です。これは正しいです ?。この情報が正しい場合、なぜ変数型に関連する異なるポインタ型を使用するのですか?この情報が正しくない場合、異なるポインタ型の違いは何ですか? –

+2

@AliAltunまず、重要な点の1つは、すべてのポインタが同じであれば、型情報を失い、言語の効率が低下し安全性が低下することです。 '* int'が' * float'を受け入れることを受け入れる機能を望んでいないか、静的に型付けされた言語の重要な利点の1つを失ってしまいます。 –

0

これはすべてのポインタタイプに1つのタイプを使用すると可能ですか?

はい、これはCの動作方法とほぼ同じです。残念ながら、それは言語を危険にします。 10バイトの配列があるとします。あなたがちょうどポインタを渡すならば、他のコードは何バイトに安全にアクセスするのか分かりません。これにより、あらゆる種類のバッファオーバーフローエラーが発生します。 (つまり、HeartBleed)

Goでは、ポインターはポインターの種類を認識しているため、コードにバッファオーバーフローの問題が常に発生することはありません。

あなたが望むことはできますが、安全でないパッケージを使用することによってのみ可能です。名前が示すように、それは非常に危険なことです。

あなたが実際にやっていることを投稿すると、おそらく人々があなたを助けることができます。パフォーマンスの低いコードを書くには、安全でないポインタを使用する方法だけではありません。

関連する問題