Wednesday, June 22, 2016

Bài 22: Cơ chế truyền dữ liệu giữa các goroutine

Việc trao đổi dữ liệu giữa các goroutine trong xử lý đồng thời là rất thường xuyên. Giải quyết vấn đề đó bằng cách sử dụng các biến chung rất hay được áp dụng nhưng đi kèm với nó là xử lý xung đột như đã thấy ở bài trước. Go cung cấp một cơ chế trao đổi khác giúp cho việc trao đổi dữ liệu giữa các goroutine mượt mà hơn. Đó là kênh (channel).

Thursday, June 2, 2016

Bài 21: Xử lý đồng thời trong Go

Thường thì các chương trình thực thi tuần tự các lệnh và các hàm trong main từ đầu đến cuối, lệnh trước xong sẽ đến lệnh sau cho đến khi kết thúc hàm main. Nếu có thể nên xây dựng chương trình theo hướng như vậy, vì đó là cách tạo chương trình đơn giản và dễ quản lý nhất. Tuy vậy, trong nhiều điều kiện, việc xử lý được nhiều tác vụ đồng thời là yêu cầu bắt buộc để đảm bảo chương trình hoạt động hiệu quả. Ví dụ dễ thấy nhất là khi xây dựng ứng dụng web. Tại cùng một thời điểm, ứng dụng web có thể nhận và xử lý nhiều yêu cầu từ nhiều người dùng khác nhau. Nếu cứ tuần tự thì những người được phục vụ sau sẽ khó mà chờ nổi. Xử lý đồng thời là yêu cầu không thể thiếu trong những tình huống này và Go đã cung cấp một công cụ tuyệt vời cho việc này.

Friday, May 6, 2016

Bài 20: Hướng đối tượng trong Go

Từ đầu những năm 1990, lập trình hướng đối tượng (Object-oriented programming - OOP) nở rộ và được hầu hết các ngôn ngữ lập trình ra đời từ đó hỗ trợ nó. Và Go cũng hỗ trợ lập trình hướng đối tượng theo cách riêng của Go.

Monday, May 2, 2016

Bài 19: Một số kiểu interface quan trọng trong Go

Trong bài trước chúng ta tìm hiểu về interface qua các ví dụ đơn giản để dễ hiểu. Trong bài này chúng ta sẽ tìm hiểu về các kiểu interface quan trọng, hay được sử dụng trong quá trình chúng ta lập trình bằng Go.

Tuesday, April 26, 2016

Bài 18: Kiểu interface trong Go

Tất cả các kiểu dữ liệu chúng ta đã từng tìm hiểu như số, chuỗi, mảng, ... đều là các kiểu dữ liệu cụ thể. Chúng mô tả chính xác dữ liệu mà chúng lưu giữ và các hành động đặc trưng của dữ liệu đó. Các hành động của các kiểu dữ liệu cụ thể này được mở rộng thêm nhờ phương thức (methods) mà ta đã tìm hiểu ở bài trước. Khi  tạo biến gán dữ liệu chúng ta có thực thể của một kiểu dữ liệu cụ thể, chúng ta biết chính xác nó là gì và có những hành động nào. Trong bài này chúng ta cùng tìm hiểu về interface, kiểu dữ liệu mang tính khái quát, trừu tượng.

Monday, April 18, 2016

Bài 17: Phương thức trong Go

Mỗi kiểu dữ liệu chứa các dữ liệu khác nhau và các hành động tương ứng với dữ liệu đó cũng khác nhau. Go đã tạo sẵn cho chúng ta nhiều hàm để thực hiện các hành động này. Ví dụ các kiểu dữ liệu số luôn đi liền với các phép toán còn lấy chiều dài, sức chứa, thêm phần tử, sao chép phần tử đi kèm với slice, v.v... Khi các biến của từng kiểu dữ liệu được tạo, chúng trở thành những thực thể, có đời sống riêng. Lúc này nhu cầu tạo ra thêm nhiều hành động khác cho các thực thể này là có tùy theo mục đích chúng ta muốn. Bên cạnh việc tạo ra các hàm để đáp ứng nhu cầu này với thực thể là tham số truyền vào thì Go hỗ trợ một cách thức tạo hành động mới. Đó là các phương thức (methods).

Friday, April 8, 2016

Bài 16: Xử lý lỗi trong Go

Một số hàm luôn thực hiện thành công. Một số khác có thể gặp lỗi nếu tham số đưa vào hoặc giá trị nhận được trong xử lý thuộc trường hợp ngoại lệ. Nhưng có nhiều hàm mà lỗi có thể xảy ra bất kỳ lúc nào dù người viết tốt đến đâu bởi nó phụ thuộc vào các yếu tố ngoài khả năng của lập trình viên như khi đọc, xuất dữ liệu hay kết nối mạng.

Do đó xử lý lỗi khi gọi hàm luôn là vấn đề được các ngôn ngữ lập trình quan tâm và Go cũng vậy. Nhờ cơ chế hàm có nhiều giá trị trả về nên Go đề xuất dùng giá trị trả về cuối cùng là giá trị thể hiện trạng thái lỗi của hàm. Thông thường giá trị này thuộc kiểu luận lý và thường đặt tên là ok với giá trị true khi không có lỗi. So với xử lý ngoại lệ ở các ngôn ngữ khác thì cơ chế trả về giá trị lỗi đơn giản và hiệu quả hơn.