如果您有 TypeScript/JavaScript 背景並深入研究 Go,那麼在兩種語言之間進行比較可能會有助於加快您的學習速度。雖然它們在許多方面都有根本的不同(Go 是一種靜態類型、編譯型語言,而TypeScript/JavaScript 是動態類型、解釋型或轉譯型語言),但有一些有用的類比將有助於使Go更加直觀。
在 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 允許透過介面和類別繼承實現更動態的行為。
在 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 中,變數用 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,否則一切都是可變的。
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 接口,即使沒有明確聲明它也是如此。
與 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 機制相比,需要更多的手動錯誤處理。
在 TypeScript 中,您將程式碼組織成可以匯入/匯出其他功能的模組。 Go 有一個類似的套件系統,其中每個檔案都是套件的一部分,而且套件可以從其他套件匯入功能。
打字稿:
var name string = "Go" const maxItems int = 100
去:
name := "Go" // type inference, like in TypeScript
在 Go 中,套件 main 是應用程式的入口點,類似於主檔案作為使用 ES 模組的 TypeScript 專案的入口點。
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中文網其他相關文章!