Go intro
Chương trình sẽ được chia nhỏ thành các bước nhỏ. Các bước này chạy thông qua rất nhiều các goroutines khác nhau. goroutines là những function chạy đồng thời cùng các goroutines khác trong toàn bộ chương trình. Trong các ngôn ngữ khác, thường sử dụng thread để chạy nhiều tác vụ đồng thời ...
Chương trình sẽ được chia nhỏ thành các bước nhỏ. Các bước này chạy thông qua rất nhiều các goroutines khác nhau.
goroutines là những function chạy đồng thời cùng các goroutines khác trong toàn bộ chương trình.
Trong các ngôn ngữ khác, thường sử dụng thread để chạy nhiều tác vụ đồng thời nhưng đối với Go rất nhiều các goroutines được thực thi tại một Thread.
Ví dụ: Nếu bạn viết một ứng dụng web server và bạn muốn xử lý nhiều request khác nhau một cách đồng thời bạn chắc có lẽ sẽ phải viết thêm nhiều code để sử dụng thêm nhiều Threads trong C hoặc Java. Thư viện net/http của Go có fuction được built sẽ trong lib để làm nhiệm vụ đó. Mỗi một request sẽ chạy trên chính goroutine của nó . goroutine sử dụng ít bộ nhớ hơn Threads và Go runtime sẽ tự động lên lịch thực thi goroutines dựa vào việc cấu hình logic processors. Mỗi một logical processor được bao bọc bởi một OS thread. Điều đó làm cho ứng dụng trở nên hiệu quả hơn và tốn ít effort hơn.
Channels là những cấu trúc dữ liệu cho phép safe data có thể giao tiếp với nhau giữa các goroutines. Channels giúp bạn loại bỏ các lỗi thông thường trong các ngôn ngữ lập trình mà cho phép chia sẻ quyền truy cập bộ nhớ Phần khó nhất của việc chạy các tác vụ đồng thời đó là đảm bảo một process đang chạy không bị chỉnh sửa bởi một process, thread hay goroutine nào khác. Channels giải quyết vấn đề lock hay synchronize data khi dùng multithread bằng cách cung cấp một pattern tạo ra safe data trong việc chỉnh sửa data đồng thời của nhiều threads. Channel sẽ giúp cho pattern chỉ được phép một goroutine chỉ được phép thay đổi data tại bất cứ thời điểm nào.
Ở hình vẽ trên ta có 3 goroutine và 2 channel. goroutine đầu truyền data thông qua channel sang goroutine đang đợi sẵn (goroutine 2), Sự trao đổi data giữa 2 goroutines này được đồng bộ. Sau khi goroutine thứ 2 được thực thi, nó tiếp tục gửi data tới goroutine thứ 3, Sự trao đổi này lại được đồng bộ và đảm bảo sự trao đổi data giữa 2 goroutine này được diễn ra. Sự trao đổi data giữa các goroutine này không đòi hỏi lock hay một cơ chế đồng bộ nào cả.
Go có một interface duy nhất cho phép bạn model behavior hơn là model type. Bạn ko cần khai báo khi sử dụng một interface trong Go, Đó là công việc của trình biên dịch, nó sẽ xác định xem giá trị của các types đó có phù hợp với interface mà bạn đang dùng hay không.
Go có các kiểu được xây dựng sẵn như int, string và kiểu do người dùng tự định nghĩa. Kiểu người dụng tự định nghĩa trong Go sẽ có một vài trường để lưu dữ liệu.
Interface cho phép bạn định nghĩa các hành vi của một kiểu, nếu một giá trị của kiểu thực thi một interface thì điều đó có nghĩa giá trị đó có một tập các behaviors. Bạn không cần khai báo rắng bạn đang thực thi một interface, chỉ cần viết ra việc thực thi đó là đủ. Ở các ngôn ngữ khác điều này được gọi là duck typing.
Trong Go nếu type của bạn thực thi method của một interface thì giá trị của nó có thể được lưu trữ ở giá trị của interface đó và không yêu cầu một sự khai báo đặc biệt nào cả.
type Reader interface { Read(p []byte) (n int, err error) }
Go interface cơ bản chỉ là một action đơn, Một trong những interface hay dùng đó là io.Reader, io.Reader interface cung cấp một cách đơn giản để khai bao kiểu mà có data được đọc ở trong một funtions khác. Để viết một kiểu để thực thi io.Reader@ interface bạn chỉ cần thực thi một Read method. Method này nhận tham số byte và trả về một giá trị interger và lỗi nếu có. Bạn có thể thực thi một io.Reader trên hầu hết các kiểu và sau đó truyền tới bất cứ một Go function nào mà nó có thể đọc được từ io.Reader.
Một chương trình Go về cơ bản bao gồm các thành phần sau:
- Package Declaration
- Import Packages
- Functions
- Variables
- Statements and Expressions
- Comments
package main import "fmt" func main() { /* This is my first sample program. */ fmt.Println("Hello, World!") }
Dòng đầu tiên định nghĩa package name. Nó là bắt buộc bởi Go program chạy trong pakages. Main Package là điểm chạy đầu tiên của chương trình, mỗi package đều có path và tên cửa nó.
Dòng thứ 2 import fmt là một processor command nói cho trình biên dịch của Go include những file nằm trong package fmt.
Dòng tiếp theo là func main() là function chính. Chương trình sẽ bắt đầu thực thi từ function này.
Dòng tiếp theo /**/ đây là comment trình biên dịch sẽ bỏ qua
Dòng tiếp fmt.Println("Hello, World!") Println là một hàm trong packege fmt được dùng để hiển thị mesages ra màn hình.
https://www.tutorialspoint.com/go/index.htm https://livebook.manning.com/#!/book/go-in-action/chapter-2/1