web-dev-qa-db-ja.com

型安全性-GO対Cポインター

Cはstatic-typed言語であり、型保証されていません。pointers(void *y)プログラムをクラッシュさせるようなものであっても、好きなことを何でもできるようにします。

GOも静的型付き言語です

それにもかかわらず、GOにはポインター(var y *int)、それはまだタイプセーフな言語と考えられています。


質問:

GOポインターを考えると、

GO言語がタイプセーフ言語と呼ばれるのはなぜですか?

3
overexchange

GoとCの間には、前者を少なくともタイプセーフにするいくつかの違いがあります。

  1. nsafe パッケージをいじらない限り、Goプログラムをクラッシュさせることはありません(OSを強制終了させるような動作を行わないという意味で)。パニックする可能性がありますが、これはクラッシュと同じではありません(回復可能です)。

  2. Goにはポインター演算がありません( source )- nil と呼ばれるソートのnull参照があります。

  3. Go's void*同等、interface{}type assertions を使用してより安全な方法でキャストされます。これはクラッシュするだけでなく、より安全な型テストまたは型スイッチを許可します。

基本的に、Goと宣言型とランタイム型(C#とJava)が同様に混在する言語は、安全でない型システムを、クラッシュの原因となる型エラーをランタイム例外に変換するランタイム型システムで補完するため、タイプセーフです。 Cには不健全な型システムがあり、危険な動作を防ぐランタイムシステムはありません。 [〜#〜] ats [〜#〜] のような一部の言語もランタイム保護に似ていますが、型システムによって不正な操作が不審になるため、タイプセーフです。基本的に:type safeは、言語があなたに違法なことをさせないことを意味します。ランタイムが停止する場合があります(Pythonなどの動的言語の場合)。型システムは時々あなたを止めます。 Goの場合は、両方の組み合わせです。

10
walpen

型安全性の欠如は、ポインタに起因するものではありません。voidポインタと、ポインタ型間で任意のキャストを実行する機能に起因します。 「整数へのポインタ」については、タイプセーフではないものはありません。Cにタイプセーフがないのは、int* is 実際には整数を含むメモリを指します。

4
Philip Kendall