Golang là gì?

Go (hay còn gọi là Golang) là một ngôn ngữ lập trình được thiết kế dựa trên tư duy lập trình hệ thống. Go được phát triển bởi Robert Griesemer, Rob Pike và Ken Thompson tại Google vào năm 2007. Điểm mạnh của Go là bộ thu gom rác và hỗ trợ lập trình đồng thời (tương tự như đa luồng – multithreading). Go là một ngôn ngữ biên dịch như C/C++, Java, Pascal… Go được giới thiệu vào năm 2009 và được sử dụng hầu hết trong các sản phẩm của Google.

Một số đặc điểm nổi bật

  • Cú pháp đơn giản và rõ ràng: Go được thiết kế với cú pháp tối giản, dễ học và dễ đọc, giúp tăng năng suất phát triển và bảo trì mã.
  • Hiệu suất cao: Go là một ngôn ngữ biên dịch (compiled language), cho phép mã được chuyển đổi trực tiếp thành mã máy (binaries) để thực thi, mang lại hiệu suất gần bằng C/C++.
  • Hỗ trợ đồng thời mạnh mẽ (Concurrency): Đây là một trong những điểm mạnh lớn nhất của Go. Go sử dụng “goroutines” (lightweight threads) và “channels” để xử lý đồng thời một cách hiệu quả và an toàn, giúp xây dựng các ứng dụng có khả năng mở rộng cao.
  • Quản lý bộ nhớ tự động (Garbage Collection): Go có bộ thu gom rác tích hợp, giúp quản lý bộ nhớ tự động, giảm thiểu rò rỉ bộ nhớ và đơn giản hóa việc lập trình.
  • Công cụ tích hợp mạnh mẽ: Go đi kèm với bộ công cụ mạnh mẽ như formatter, linter, test runner, và hệ thống quản lý gói (package management), giúp quá trình phát triển trở nên thuận tiện hơn.
  • Mã nguồn mở và cộng đồng lớn: Là một dự án mã nguồn mở với cộng đồng phát triển và hỗ trợ tích cực.
  • Tính đa nền tảng: Go có thể biên dịch và chạy trên nhiều hệ điều hành khác nhau như Linux, macOS, Windows, FreeBSD, v.v.

Tuy nhiên chính vì muốn ngôn ngữ này trở nên cực kỳ đơn giản mà các nhà phát triển đã loại bỏ một số tính năng có trong các ngôn ngữ khác như:

  • Không hỗ trợ kế thừa
  • Không hỗ trợ quá tải toán tử hoặc ghi đè phương thức
  • Không hỗ trợ thao tác trên con trỏ (vì lý do bảo mật)
  • Không hỗ trợ kiểu Generic (giống như template trong C++)

Ứng dụng của Go

  • Phát triển hệ thống backend: Xây dựng các API RESTful, microservices, dịch vụ web hiệu suất cao. Nhiều công ty lớn như Google, Uber, Netflix sử dụng Go cho các dịch vụ backend của mình.
  • Công cụ DevOps: Các công cụ nổi tiếng như Docker, Kubernetes, Terraform đều được viết bằng Go.
  • Ứng dụng mạng: Phát triển các proxy, máy chủ mạng, ứng dụng xử lý dữ liệu mạng.
  • Xử lý phân tán và Cloud Native: Phù hợp cho việc xây dựng các hệ thống phân tán và ứng dụng Cloud Native.
  • IoT (Internet of Things): Do hiệu suất cao và quản lý bộ nhớ hiệu quả, Go cũng là một lựa chọn tốt cho các thiết bị IoT và máy chủ nhỏ.

Các kiểu dữ liệu trong Go

Kiểu dữ liệu cơ bản (Basic Type)

Interger

  • int: Kiểu số nguyên có dấu, kích thước phụ thuộc vào kiến trúc hệ thống (32 hoặc 64 bit). Đây là kiểu được sử dụng phổ biến nhất khi bạn cần một số nguyên.
  • int8, int16, int32, int64: Các kiểu số nguyên có dấu với kích thước cố định là 8, 16, 32, 64 bit tương ứng.
  • uint, uint8, uint16, uint32, uint64, uintptr: Các kiểu số nguyên không dấu (chỉ chứa giá trị không âm). uintptr đủ lớn để chứa địa chỉ bộ nhớ.
  • byte: Là một bí danh cho uint8. Thường được dùng để biểu diễn một byte dữ liệu.
  • rune: Là một bí danh cho int32. Dùng để biểu diễn một ký tự Unicode (một mã điểm Unicode).

Floating-point

  • float32: Số thực dấu phẩy động độ chính xác đơn (single-precision).
  • float64: Số thực dấu phẩy động độ chính xác kép (double-precision). Đây là kiểu được sử dụng phổ biến nhất khi bạn cần một số thực.

Complex Type

  • complex64: Số phức với phần thực và phần ảo là float32.
  • complex128: Số phức với phần thực và phần ảo là float64.

Boolean

bool: Có hai giá trị là true hoặc false.

String

string: Một chuỗi ký tự Unicode không thay đổi (immutable). Chuỗi trong Go được biểu diễn dưới dạng byte (UTF-8).

Kiểu dữ liệu tổng hợp (Composite Types / Derived Types)

Mảng (Arrays):

  • [n]Type: Một tập hợp có kích thước cố định gồm n phần tử cùng kiểu Type. Kích thước của mảng là một phần của kiểu dữ liệu.
  • Ví dụ: var a [5]int (một mảng 5 số nguyên).
  • Slice (Mảng động):
    • []Type: Một cấu trúc dữ liệu linh hoạt hơn mảng, đại diện cho một phân đoạn (segment) của một mảng bên dưới. Slice có thể thay đổi kích thước.
    • Đây là cách phổ biến nhất để làm việc với các tập hợp dữ liệu trong Go.
    • Ví dụ: var s []int (một slice của số nguyên).

Map (Bảng băm / Hash Map):

  • map[KeyType]ValueType: Một tập hợp các cặp khóa-giá trị, nơi mỗi khóa là duy nhất và được ánh xạ tới một giá trị.
  • Khóa (KeyType) phải là một kiểu có thể so sánh được (ví dụ: số nguyên, chuỗi, boolean, array, struct không chứa slice, map, hoặc function).
  • Ví dụ: var m map[string]int (một map ánh xạ chuỗi tới số nguyên).

Struct (Cấu trúc):

  • struct { field1 Type1; field2 Type2; ... }: Một tập hợp các trường (fields) có thể thuộc các kiểu khác nhau. Struct cho phép bạn nhóm các dữ liệu liên quan lại với nhau thành một đơn vị logic. Ví dụ:
    type Person struct {
       Name string
       Age int
    }

Con trỏ (Pointers):

  • *Type: Biến con trỏ lưu trữ địa chỉ bộ nhớ của một biến thuộc kiểu Type. Go hỗ trợ con trỏ nhưng không hỗ trợ số học con trỏ (pointer arithmetic) như C/C++, giúp an toàn hơn.
  • Ví dụ: var p *int (một con trỏ tới số nguyên).

Hàm (Functions):

  • func(param1 Type1, ...) (return1 TypeA, ...): Go coi hàm là một kiểu dữ liệu hạng nhất (first-class citizen), nghĩa là bạn có thể gán hàm cho biến, truyền hàm làm đối số cho hàm khác, hoặc trả về hàm từ một hàm khác. Ví dụ:
    func add(a, b int) int {
       return a + b
    }

Interface (Giao diện):

  • interface{ method1(); method2(); ... }: Một tập hợp các chữ ký phương thức. Bất kỳ kiểu nào triển khai tất cả các phương thức của một interface đều được coi là thỏa mãn interface đó. Go sử dụng “duck typing” cho interface. Ví dụ:
    type Reader interface {
       Read(p []byte) (n int, err error)
    }

Kênh (Channels):

  • chan Type: Một cơ chế để giao tiếp giữa các goroutine. Channels cho phép gửi và nhận giá trị giữa các goroutine một cách an toàn đồng thời.
  • Ví dụ: ch := make(chan int) (một kênh gửi/nhận số nguyên).

 

Tham khảo: Giới thiệu ngôn ngữ lập trình GoLang

About the Author

Đức Phát

View all author's posts

Leave a Comment

Your email address will not be published. Required fields are marked *

Bài viết khác

Tìm hiểu Git và GitHub

Git là gì? Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS), nó là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. Git cung cấp cho mỗi lập trình viên kho lưu trữ (repository) riêng chứa toàn bộ lịch sử thay đổi. Version Control System […]

Browser

Browser (Web Browser, Trình duyệt web) là phần mềm trên máy tính, điện thoại hoặc thiết bị thông minh, cho phép người dùng truy cập, hiển thị và tương tác với các trang web, tài nguyên Internet. Về bản chất, trình duyệt gửi các yêu cầu (HTTP/HTTPS request) đến máy chủ web, nhận về mã […]

Tìm hiểu DNS

DNS là gì? DNS (Domain Name System) là một dịch vụ phân giải tên miền, giúp chuyển đổi các tên miền (ví dụ: www.ducphat.com) thành địa chỉ IP (ví dụ: 93.184.216.34) và ngược lại. Thay vì phải nhớ dãy số IP, chúng ta chỉ cần nhập tên miền, DNS sẽ tìm kiếm địa chỉ IP […]

Tìm hiểu giao thức HTTP

HTTP là gì? HTTP (HyperText Transfer Protocol) là giao thức truyền tải siêu văn bản, dùng để trao đổi dữ liệu giữa client (thường là trình duyệt web) và server (máy chủ web) qua mô hình request–response. HTTP hoạt động ở tầng ứng dụng (Application Layer) trong mô hình OSI/TCP-IP, dựa trên kết nối TCP […]

Internet là gì?

Internet, hay còn gọi là mạng toàn cầu, là một hệ thống mạng máy tính kết nối với nhau trên toàn thế giới, cho phép trao đổi dữ liệu và thông tin một cách nhanh chóng và liên tục. Internet kết nối các thiết bị thông qua các giao thức và phương thức truyền tải […]

Agile là gì?

Tổng quan về Agile? Agile (quy trình phát triển phần mềm linh hoạt) là một phương pháp phát triển phần mềm dựa trên sự hợp tác, linh hoạt, phản hồi nhanh với thay đổi và phát triển theo từng giai đoạn nhỏ (iteration). Thay vì xây dựng toàn bộ sản phẩm rồi mới kiểm thử […]