Golang

Pointer in golang

Khi sử dụng con trỏ trong golang, bạn rất dễ mắc phải lỗi kiểm tra giá trị trong trường hợp bị null.

Hãy xem ví dụ sau:

type Person structure {

IsStudent *bool

}

var person Person

Khi kiểm tra person có phải là student không? Bình thường sẽ dùng:

if *person.IsStudent {

//do something

}

Tuy nhiên sẽ có 1 số trường hợp person là null, vì vậy việc gọi hàm person.IsStudent bị lỗi.

Vì vậy câu lệnh nên là:

if person.IsStudent != nil && *person.IsStudent {

//do something

}

Câu hỏi đặt ra ở đây: sao không để IsPerson là kiểu bool, cần gì để kiểu con trỏ bool.

Phần này lại liên quan tới phần lỗi (hay tính năng) của golang. Khi bạn gửi 1 request với kiểu bool, datetime, v.v.. lên để lưu vào database. Ví dụ trên là kiểu bool

type Person structure {

IsStudent bool

}

Bạn gửi giá trị IsStudent = true lên. Sau khi chạy và lưu dữ liệu. Bạn sẽ thấy dữ liệu đã lưu đúng yêu cầu của bạn. Tuy nhiên, bạn tiếp tục request lên với IsStudent = false lên. Sau khi nhìn vào database, bạn lại thấy không có bất kì sự thay đổi gì cả.

Nguyên nhân: golang không hiểu về giá trị false và giá trị nil. Nó mặc định khi bạn truyền như vậy lên thì sẽ coi giá trị không có => không lưu trường này vào database.

Vì vậy để khắc phục vấn đề trên, sẽ thay việc sử dụng bool, sẽ sử dụng con trỏ bool.

Đây là phần nghiên cứu của mình, nếu như bạn thấy vấn đề chưa đúng, hay đóng góp, hãy để lại comment