Go Interface: Dynamic Typing
Từ mã nguồn, chúng ta có thể thấy rằng iface
bao gồm hai trường: tab
là con trỏ bảng giao diện, trỏ đến thông tin về kiểu dữ liệu; data
là con trỏ dữ liệu, trỏ đến dữ liệu cụ thể. Chúng được gọi lần lượt là kiểu động
và giá trị động
. Giá trị giao diện bao gồm kiểu động
và giá trị động
.
【Mở rộng 1】So sánh kiểu giao diện với nil
Giá trị không của giao diện là khi cả kiểu động
và giá trị động
đều là nil
. Chỉ khi cả hai phần này đều là nil
, giá trị giao diện mới được coi là giá trị giao diện == nil
.
Xem một ví dụ:
Kết quả:
Ban đầu, c
có kiểu động
và giá trị động
đều là nil
, g
cũng là nil
. Khi gán g
cho c
, kiểu động
của c
trở thành *main.Gopher
, mặc dù giá trị động
của c
vẫn là nil
, nhưng khi so sánh c
với nil
, kết quả là false
.
【Mở rộng 2】
Hãy xem một ví dụ và xem kết quả của nó:
Kết quả chạy chương trình:
Ở đây, chúng ta định nghĩa một cấu trúc MyError
, triển khai hàm Error() string
, từ đó triển khai giao diện error
. Hàm Process()
trả về một giao diện error
, trong đó có chứa chuyển đổi kiểu ngầm định. Vì vậy, mặc dù giá trị của nó là nil
, nhưng kiểu của nó là *MyError
, khi so sánh với nil
, kết quả là false
.
【Mở rộng 3】Làm thế nào để in ra kiểu động và giá trị động của giao diện?
Xem mã nguồn trực tiếp:
Trong mã nguồn, chúng ta trực tiếp định nghĩa một cấu trúc iface
, sử dụng hai con trỏ để mô tả itab
và data
, sau đó ép buộc giải thích nội dung của a, b, c trong bộ nhớ thành iface
tự định nghĩa. Cuối cùng, chúng ta có thể in ra địa chỉ của kiểu động và giá trị động.
Kết quả chạy chương trình như sau:
Kiểu động và giá trị động của a đều là 0, tức là nil; Kiểu động của b và c giống nhau, đều là *int
; Cuối cùng, giá trị động của c là 5.