首頁  >  文章  >  後端開發  >  從 TypeScript/JavaScript 的角度來理解

從 TypeScript/JavaScript 的角度來理解

DDD
DDD原創
2024-10-26 05:29:02694瀏覽

Understanding Go through the Lens of TypeScript/JavaScript

如果您有 TypeScript/JavaScript 背景並深入研究 Go,那麼在兩種語言之間進行比較可能會有助於加快您的學習速度。雖然它們在許多方面都有根本的不同(Go 是一種靜態類型、編譯型語言,而TypeScript/JavaScript 是動態類型、解釋型或轉譯型語言),但有一些有用的類比將有助於使Go更加直觀。

1. Go 中的結構體 ≈ TypeScript 中的型別

在 TypeScript 中,您定義類型和介面來描述物件的形狀。類似地,Go 有結構體,用於定義自訂類型。結構體可以包含不同類型的字段,類似於 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 不同,TypeScript 允許透過介面和類別繼承實現更動態的行為。

2. Go 中的方法:接收者 ≈ JavaScript 中的原型

在 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),讓您存取欄位並使用方法。

3. TypeScript 中的 let、var、const ≈ Go 中的變數宣告

在 Go 中宣告變數的方式讓人想起 JavaScript 的 let、var 和 const。在 Go 中,變數用 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 中,let 和 const 之間沒有像 JavaScript 那樣的區別。預設情況下,Go 中的所有變數在使用 var 宣告時都是可變的,這表示它們的值可以在以後變更。如果你想在 Go 中使變數不可變,則必須明確使用 const 關鍵字。與 JavaScript 不同,在 Go 中,你可以用 let 來表示可變變量,用 const 來表示不可變變量,除非你將其宣告為 const,否則一切都是可變的。

4. Go 介面 ≈ TypeScript 介面(有差異)

TypeScript 介面定義物件的形狀,而 Go 介面定義行為(即物件必須具有的一組方法)。在 Go 中,物件透過擁有所有必需的方法來隱式「實現」接口,這與 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 接口,即使沒有明確聲明它也是如此。

5. Go 中的錯誤處理 ≈ JavaScript 中的 Try-Catch(但有所不同)

與 JavaScript 的 try-catch 相比,Go 中的錯誤處理感覺非常不同。在 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 機制相比,需要更多的手動錯誤處理。

6. Go 中的套件系統 ≈ TypeScript 中的 ES 模組

在 TypeScript 中,您將程式碼組織成可以匯入/匯出其他功能的模組。 Go 有一個類似的套件系統,其中每個檔案都是套件的一部分,而且套件可以從其他套件匯入功能。

打字稿:

var name string = "Go"
const maxItems int = 100

去:

name := "Go" // type inference, like in TypeScript

在 Go 中,套件 main 是應用程式的入口點,類似於主檔案作為使用 ES 模組的 TypeScript 專案的入口點。

7. Go 中的併發:Goroutines ≈ 非同步程式設計

JavaScript 使用 async/await 和 Promise 的非同步程式設計感覺有點類似 Go 的 goroutine。 Goroutines 允許函數並發運行,使得 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 的 goroutine,您可以使用 go 關鍵字同時啟動函數,而 TypeScript 透過 async/await 和 Promise 來實現這一點。

結論

從 TypeScript/JavaScript 切換到 Go 起初可能看起來令人畏懼,但進行這些比較可以幫助使過渡更加順利。了解 Go 更嚴格的類型系統、明確介面和並發模型將使您的旅程受益匪淺。一旦您掌握了 Go 更明確和結構化的本質,您就會欣賞它在建立健壯系統方面的性能和可靠性。

以上是從 TypeScript/JavaScript 的角度來理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn