Tại Sao Go Khác Biệt Với Các Ngôn Ngữ Khác?

Tại Sao Go Khác Biệt Với Các Ngôn Ngữ Khác?

Ngôn ngữ lập trình rõ ràng có thể được coi là công cụ chính trong kho vũ khí của mọi lập trình viên. Bài viết này sẽ là một trong số rất nhiều bài viết đề cập đến một ngôn ngữ lập trình phổ biến rộng rãi, mới và khá độc đáo có tên là Go. Tuy nhiên, để giống như Go - đơn giản, khác biệt và hữu ích. Tôi muốn hình thành một tầm nhìn mới bằng cách phân tích giải pháp thiết kế của Golang, bối cảnh xuất hiện, các tính năng khác biệt của nó và cuối cùng, tại sao nó có thể được sử dụng hiệu quả cho ngày hôm nay.

Tại sao Go ra đời?

Không phải tự nhiên mà Go ra đời, và cũng không phải tự nhiên mà trong khảo sát của stackoverflow năm 2020 đã chỉ ra rằng, Go nằm trong Top 3 ngôn ngữ mà các lập trình viên muốn tìm hiểu và sử dụng nhất với 17,9% số người lựa chon.

Để hiểu đầy đủ về bản chất của Golang, chúng ta hãy đi sâu vào bối cảnh tạo ra nó. Vì vào thời điểm Google đang đối mặt với các vấn đề mà Google không thể khắc phục được bằng các công cụ hiện có, Go ra đời với nhu cầu thay đổi mạnh mẽ:

“Mục tiêu của dự án Go là loại bỏ sự chậm chạp và vụng về trong quá trình phát triển phần mềm tại Google, đồng thời làm cho quá trình này hiệu quả hơn và có thể mở rộng. Ngôn ngữ này dành cho những người viết và đọc code, gỡ lỗi và bảo trì các hệ thống phần mềm lớn. " - Rob Pike, người tạo ra Golang

Go được thiết kế trong khi có một loạt các vấn đề cụ thể cần giải quyết và ban đầu sở hữu một cơ sở vững chắc gồm các tính năng tốt nhất từ các ngôn ngữ lập trình cao cấp như C, Pascal, Modula và Oberon. Nó cũng có các đặc điểm hữu ích của các ngôn ngữ - Python, C ++, Java, v.v. 

Sự khác biệt của Go so với các ngôn ngữ khác

Kế thừa không có nghĩa là sao chép, thay vào đó là việc tìm ra một cách hoàn toàn mới để giải quyết vấn đề, vì đôi khi để giải quyết một vấn đề, bạn phải từ bỏ những gì không hiệu quả. Và kết quả là, mọi tính năng chính của Go hầu hết đều bắt nguồn từ những hạn chế chính, chẳng hạn như:

  • Có chủ ý đơn giản hóa và cú pháp rõ ràng để dễ đọc, dễ học và bắt đầu.
  • Có ngữ nghĩa được đánh máy nghiêm ngặt, an toàn và hoàn toàn tĩnh để xử lý các lỗi tĩnh tại thời điểm biên dịch, đồng thời tăng tốc độ thực thi và xây dựng
  • Có một bộ thu gom rác, để giải quyết tình trạng mất an toàn bộ nhớ nhưng vẫn giữ tốc độ thực thi cao hợp lý và hiệu quả tài nguyên 
  • Thiếu các tính năng phổ biến và syntax sugar để tối thiểu hóa, chính xác và đơn giản để giải quyết một vấn đề cụ thể 
  • Không có các nguyên tắc hướng đối tượng phổ biến như kế thừa, các lớp và giao diện thông thường, điều này ngày càng trở nên thường xuyên hơn kể từ sự gia tăng của các ngôn ngữ hướng chức năng, mặc dù Go cũng một phần nào là ngôn ngữ đa mô hình.
  • Vendoring (được thay thế bằng Mô-đun Go kể từ 1.11), một hệ thống quản lý phụ thuộc mạnh và trình hợp dịch của nó cực kỳ gần với mã nhị phân để đạt được các bản dựng siêu nhanh, nhẹ và hiệu quả. Điều đó làm cho nó trở thành một sự kết hợp hoàn hảo cho mô hình kiến trúc microservice và cho sự phát triển trên nền tảng đám mây nói chung.
  • Không có xử lý ngoại lệ try-catch mặc dù bị tranh cãi và bị chỉ trích rất nhiều

Như đã thấy, các nhà phát triển của Go đã cố gắng đưa ra một hệ thống ràng buộc dựa trên ngôn ngữ rất hiệu quả để đạt được một số đặc điểm và tính năng xịn xò nhất của nó. Bằng cách sử dụng các ràng buộc đơn lẻ để đạt được đồng thời không chỉ một mà là nhiều tính năng chính cùng một lúc.

Ngoài ra, tại thời điểm này, rõ ràng là Go không giống như các ngôn ngữ khác được phát triển phổ biến bằng cách thêm các tính năng mới, sau đó mới tăng độ phức tạp rồi hội tụ mà Go đã tiếp cận theo cách để khắc phục các hạn chế ngay từ đầu.

“Nhiều người mới sử dụng Go cần những tính năng ở các ngôn ngữ cũ họ sử dụng. Nhưng những tính năng đó không thuộc về Go. Thêm các tính năng vào Go sẽ không làm cho nó tốt hơn mà chỉ khiến nó nặng nề hơn.  ”. - Rob Pike, người tạo ra Golang đã nói.

Các tính năng riêng biệt

Tuy nhiên, điều đó không có nghĩa là   là Go bị thiếu hoặc thiếu một số tính năng quan trọng. Tuy nhiên,để đơn giản, Go đã cân nhắc về việc không có các tính năng phức tạp hơn mà không giải quyết được vấn đề.

Hãy cùng xem qua một số điều “đơn giản” trong Go:

  • Trên thực tế, bộ thu gom rác (Gabage Collectors) là tính năng đơn giản nhất của Go, vì nó không có bất kỳ giao diện điều khiển nào. Tuy nhiên, đơn giản nhất cũng là phức tạp nhất vì nó quản lý để cung cấp sự an toàn cho bộ nhớ trong khi tiết kiệm tốc độ thời gian chạy cực cao và cung cấp hiệu quả tài nguyên đáng ngạc nhiên.
  • Concurrency hay còn gọi là Goroutines - là tính năng chủ lực của ngôn ngữ lập trình Go để tận dụng năng lực xử lý của CPU. Nó thường được biết đến là cách triển khai dễ dàng và đơn giản nhất của concurrency model cho đến nay. Trên thực tế, quá trình tạo ra một quy trình con mới đơn giản gần như không làm gì cả. Tất cả những gì bạn cần làm chỉ là gõ Go.
  • Interfaces (các giao diện) là một trong những đặc điểm khác biệt và dễ nhận biết nhất của Golang. Giải pháp thiết kế độc đáo của họ tự giải quyết hầu hết các chỉ trích của OOP, cho phép tính trực giao và các kiến trúc thành phần.
  • Packages hoạt động trơn tru. Bằng cách sử dụng công cụ go get, bạn có thể làm điều đó ở bất cứ đâu: Gopkg, GitHub, GitLab, BitBucket, thậm chí cả nguồn kho lưu trữ được lưu trữ của riêng bạn từ khi "vanity” được biết đến. Tuy nhiên nó cũng khá phức tạp để cho phép thành phần hóa, mô-đun, khả năng mở rộng, chia sẻ, ẩn dữ liệu và cô lập, v.v.
  • Thư viện chuẩn của Go chứa rất nhiều tính năng tiện dụng tuyệt vời chứng tỏ rằng Golang trên thực tế là một ngôn ngữ khá giàu tính năng. Tuy nhiên, cách chúng được thực hiện là một điều gì đó khiến nó trở nên độc đáo. 
  • Reflection - Đặc biệt, ngôn ngữ này không đơn giản để sử dụng như những ngôn ngữ khác. Mặc dù vậy, Go vẫn cố gắng tận dụng relfection tối đa trong khi vẫn giữ cho nó tương đối dễ sử dụng.

Phạm vi ứng dụng

Vậy bạn có thể làm việc hiệu quả ở đâu với nó? Bạn thực sự có thể làm gì với Go? Go được thiết kế cho một mục đích cụ thể riêng biệt, vì vậy nó không phải là một ngôn ngữ có thể dùng cho nhiều thứ chung chung
Tuy nhiên, trên thực tế, chúng được hòa làm một.

Sau đó, chúng ta hãy xem xét khả năng của Go:

  • Phát triển dịch vụ web gốc đám mây, đặc biệt là các dịch vụ nhỏ sử dụng Go kit, Micro, Gizmo, Kite, Goa, Caddy, v.v.
  • Phát triển REST API bằng Gin, Martini, Revel, Gorilla, Beego, v.v.
  • Phát triển API RPC sử dụng gRPC, Twirp, Spiral, Gorilla
  • GraphQL API phát triển graphql-go, gqlgen, Thunder
  • Phát triển các chức năng không máy chủ bằng cách sử dụng Serverless Framework, Google Cloud Functions, Sparta, Gordon
  • Phát triển giao diện người dùng web (WebAssembly) bằng Hugo, Vugu, TinyGo, Vecty
  • Robotics, IoT và phát triển nhúng sử dụng Gobot, Mainflux, TinyGo, EMBD
  • Phát triển ứng dụng CLI bằng Cobra, cli
  • Học máy và phát triển AI bằng GoLearn, Gorgonia

Và một số trường hợp sử dụng không đặc biệt rõ ràng:

  • Phát triển ứng dụng di động bằng gomobile
  • Phát triển ứng dụng dành cho máy tính để bàn bằng Lorca, Wails, Fyne
  • Phát triển trò chơi bằng Ebiten, Pixel, G3N
  • Phát triển Chatbot cho Discord, Telegram, Slack, hơn thế nữa
  • Phát triển blockchain

Tạm kết

Hiện tại, phạm vi ứng dụng của Golang được định hướng rõ ràng hơn là lập trình đám mây, web và hệ thống. Nhưng xét về cộng đồng nhiệt tình, sáng kiến và tích cực, Go đang dần tiến vào hầu hết các lĩnh vực ứng dụng CNTT khác nhau.

Học và làm việc với Go ít nhiều cho bạn những trải nghiệm quý giá.

Tham khảo: medium.com