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 chouint8
. Thường được dùng để biểu diễn một byte dữ liệu.rune
: Là một bí danh choint32
. 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ồmn
phần tử cùng kiểuType
. 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ểuType
. 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