TypeScript/JavaScript のバックグラウンドを持っていて Go に飛び込む場合は、学習をスピードアップするために 2 つの言語間の類似点を描くと役立つ場合があります。これらは多くの点で根本的に異なります (Go は静的に型付けされ、コンパイルされる言語であり、TypeScript/JavaScript は動的に型付けされ、解釈またはトランスパイルされる言語です) が、Go をより直感的にするのに役立つ便利な類似点がいくつかあります。
TypeScript では、オブジェクトの形状を記述するための型とインターフェイスを定義します。同様に、Go にはカスタム型の定義に使用される構造体があります。 TypeScript の型またはインターフェイスに異なるプロパティを含めることができるのと同様に、構造体には異なる型のフィールドを含めることができます。
TypeScript:
type Book = { title: string; pages: number; read(): void; }
行きます:
type Book struct { Title string Pages int } func (b Book) Read() { fmt.Println("Reading", b.Title) }
どちらの場合も、オブジェクトの構造を定義します。ただし、Go の構造体はより厳密であり、インターフェイスとクラスの継承によるより動的な動作を可能にする TypeScript とは異なり、継承をサポートしません。
JavaScript では、オブジェクトのプロトタイプにメソッドを定義すると、そのメソッドはそのオブジェクトのインスタンスに関連付けられます。 Go は、特定の構造体に関連付けられた レシーバー関数 で同様の概念を使用します。これは、JavaScript でプロトタイプを介して関数がオブジェクトに付加される方法と似ています。
JavaScript:
function Book(title, pages) { this.title = title; this.pages = pages; } Book.prototype.read = function() { console.log("Reading", this.title); }
行きます:
type Book struct { Title string Pages int } func (b Book) Read() { fmt.Println("Reading", b.Title) }
Go では、Read メソッドにはレシーバー (b Book) があり、JavaScript でメソッドがプロトタイプに関連付けられるのと同じように機能します。これにより、オブジェクトのインスタンス (ここでは b) が提供され、フィールドにアクセスしてメソッドを使用できるようになります。
Go で変数を宣言する方法は、JavaScript の let、var、const を思い出させます。 Go では、TypeScript と同様に、変数は var で宣言され、定数は const で宣言されます。
TypeScript:
let name: string = "TypeScript"; const maxItems: number = 100;
行きます:
var name string = "Go" const maxItems int = 100
Go の := 省略表現は、変数を迅速に宣言できるという点で、JavaScript の let に似ています。
type Book = { title: string; pages: number; read(): void; }
Go では、JavaScript のような let と const の区別はありません。デフォルトでは、Go のすべての変数は var で宣言された場合に変更可能です。つまり、それらの値は後で変更できます。 Go で変数を不変にしたい場合は、明示的に const キーワードを使用する必要があります。可変変数には let 、不変変数には const の両方がある JavaScript とは異なり、Go では、const として宣言しない限り、すべてが可変です。
TypeScript インターフェイスはオブジェクトの形状を定義し、Go インターフェイスは動作 (つまり、オブジェクトが持つ必要があるメソッドのセット) を定義します。 Go では、オブジェクトは必要なメソッドをすべて持つことによって暗黙的にインターフェイスを「実装」します。これは、TypeScript の明示的な実装とは対照的です。
TypeScript:
type Book struct { Title string Pages int } func (b Book) Read() { fmt.Println("Reading", b.Title) }
行きます:
function Book(title, pages) { this.title = title; this.pages = pages; } Book.prototype.read = function() { console.log("Reading", this.title); }
Go では、Read メソッドを実装する型は、明示的に宣言していなくても、Reader インターフェイスを実装しているとみなされます。
Go でのエラー処理は、JavaScript の try-catch とは大きく異なります。 Go では、エラー処理は戻り値を使用して明示的に行われますが、JavaScript では例外が使用されます。
JavaScript:
type Book struct { Title string Pages int } func (b Book) Read() { fmt.Println("Reading", b.Title) }
行きます:
let name: string = "TypeScript"; const maxItems: number = 100;
Go では、エラーは関数から返されるため、明示的にチェックする必要があります。これにより、制御フローがより予測可能になりますが、JavaScript の try-catch メカニズムと比較して手動によるエラー処理が必要になります。
TypeScript では、他の機能部分をインポート/エクスポートできるモジュールにコードを編成します。 Go には同様のパッケージ システムがあり、各ファイルはパッケージの一部であり、パッケージは他のパッケージから機能をインポートできます。
TypeScript:
var name string = "Go" const maxItems int = 100
行きます:
name := "Go" // type inference, like in TypeScript
Go では、メイン ファイルが ES モジュールを使用する TypeScript プロジェクトのエントリ ポイントとして機能するのと同様に、パッケージ main はアプリケーションのエントリ ポイントです。
async/await と Promise を使用した JavaScript の非同期プログラミングは、Go のゴルーチンにいくらか似ているように感じます。 Goroutine を使用すると関数を同時に実行できるため、Go の同時実行モデルが非常に強力になります。
JavaScript:
interface Reader { read(): void; } class Book implements Reader { read() { console.log("Reading a book"); } }
行きます:
type Reader interface { Read() } type Book struct { Title string } func (b Book) Read() { fmt.Println("Reading", b.Title) }
Go のゴルーチンを使用すると、go キーワードと同時に関数を起動できますが、TypeScript は async/await と Promise を通じてこれを実現します。
TypeScript/JavaScript から Go への切り替えは、最初は気が遠くなるように思えるかもしれませんが、これらの比較を行うと、移行をよりスムーズに行うことができます。 Go のより厳密な型システム、明示的なインターフェイス、同時実行モデルを理解することで、やりがいのあるものになります。 Go のより明示的で構造化された性質を理解すれば、堅牢なシステムを構築する際のそのパフォーマンスと信頼性を理解できるでしょう。
以上がTypeScript/JavaScript のレンズを通して理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。