14/08/2019, 21:28

Vài điều hay ho về select trong golang

Linh tinh về select Trong go thì cách dùng select cơ bản nhất sẽ để điều khiển read write vào các channel. Nắm rõ cách sử dụng select là vô cùng cần thiết cho intermediate gopher. Mô hình sử dụng select thì thông thường sẽ là: select { case <channel ...

Linh tinh về select

Trong go thì cách dùng select cơ bản nhất sẽ để điều khiển read write vào các channel. Nắm rõ cách sử dụng select là vô cùng cần thiết cho intermediate gopher. Mô hình sử dụng select thì thông thường sẽ là:

Đọc từ channel

Tuy nhiên có 1 điểm cần chú ý ở đây là : nếu không có default thì xử lý sẽ bị block

Đoạn code trên chính là mô tả dễ hiểu nhất cho việc hiểu thế nào là “non blocking IO”

Để sử dụng giá trị lấy ra từ channel thì có thể viết như dưới đây:

Viết vào channel

Tương tự như read, default dành cho non-blocking writingwriting

Quiz time

Có 2 câu hỏi thú vị được đặt ra về việc đọc / ghi vào channel

Quiz 1: Đọc / ghi vào nil channel thì chuyện gì sẽ xảy ra?

Câu trả lời là 2, với nil channel thì cả read và write sẽ đều bị block. Việc này sẽ dẫn đến một cách dùng khá hay là việc thay đổi trạng thái block thông qua việc gán nil, ví dụ như trong trường hợp dưới đây thì chúng ta có thể điều khiển việc xử lý sẽ chui vào case 1 hay case 2 thông qua việc gán nil (hoặc ngược lại, gán giá trị)

Quiz 2: Đọc / ghi vào closed channel thì chuyện gì sẽ xảy ra?

Câu trả lời là 3: done channel sẽ bị block khi đọc bởi không có data, và khi close thì việc block sẽ được vô hiệu hoá và chúng ta có thể return xử lý ngay lập tức

Sử dụng reflect với select

Đôi khi cái bạn muốn select từ đó là không cố định, hoặc là bạn muốn select N chan cùng một lúc, khi đó thì syntax của go sẽ không support việc đó. Khi đó bạn phải hack bằng cách sử dụng reflection trong go. Điều đó được thể hiện trong ví dụ dưới đây:

Techtalk via kipalog

0