2016-01-05 16 views
5

Sử dụng sự phản chiếu, chúng ta có thể nhận được tên kiểu, kích thước lưu trữ và hàm của kiểu đã cho (chẳng hạn như uint64, struct do người dùng định nghĩa và vv). Thậm chí, chúng ta có thể sửa đổi một số trường của kiểu đã cho. Golang thực hiện phản xạ như thế nào? Tôi đoán các cách sau đây:Golang thực hiện phản chiếu như thế nào?

  1. Mọi loại golang, bao gồm cả loại do người dùng xác định, chính nó có thông tin về tên loại, tên trường và tên hàm. Golang phản ánh chỉ đọc những thông tin này hoặc gọi hàm.

  2. Thông qua một số cơ chế, Golang có thể nhận được tên loại, dung lượng lưu trữ và cứ thế. Và chính loại đó không có những thông tin này.

Tôi đã đọc mã phản chiếu golang. Tôi đoán rằng golang sử dụng cách thứ hai. Ai có thể mô tả triển khai cụ thể của sự phản chiếu? Hoặc giới thiệu cho tôi một số tài liệu? Đọc tất cả các mã là khó khăn đối với tôi.

+0

Nói một cách đơn giản, cách phản ánh của golang nhận thông tin về loại, chẳng hạn như tên loại, kích thước lưu trữ, trường, chức năng, v.v. Thậm chí, sự phản chiếu có thể đặt giá trị. –

Trả lời

4

Đây chỉ là tổng quan và có thể không chính xác 100% nhưng hy vọng bạn sẽ thấy nó hữu ích.

Tại thời gian xây dựng Gò mối liên kết sẽ nhúng thông tin về tất cả các loại được sử dụng bởi các ứng dụng vào thực thi (https://github.com/golang/go/blob/master/src/runtime/symtab.go#L39)

Mỗi giá trị giao diện chứa một con trỏ đến kiểu dữ liệu mô tả (https://github.com/golang/go/blob/master/src/runtime/type.go#L14)

Trong chuyển đổi từ một loại được biết đến tại thời gian biên dịch thành một giá trị giao diện Trình biên dịch sẽ trỏ mô tả kiểu của giá trị giao diện này vào bộ mô tả kiểu bê tông (nó được biết tại thời gian biên dịch!).

Ví dụ: khi bạn gọi reflect.TypeOf(uint(87)):

  • một giá trị giao diện được tạo ra bởi trình biên dịch tham chiếu uint loại mô tả
  • giá trị giao diện này sẽ được chuyển cho reflect.TypeOf chức năng như là đối số
  • reflect.TypeOf chức năng sử dụng mô tả kiểu đó đã được lưu trữ bởi trình liên kết trong tệp thực thi để nhận thông tin sắp xếp (và các thông tin khác) về loại uint.
1

Mô tả giao diện được mô tả rõ ở đây: The Laws of Reflection.

Biến loại giao diện lưu trữ một cặp: giá trị cụ thể được gán cho biến và trình mô tả loại giá trị đó.

Về cơ bản, loại được biết là tĩnh từ mã của bạn. Các loại giao diện linh hoạt hơn giữ nguyên kiểu gốc để lấy lại kiểu dữ liệu gốc.

+0

Ví dụ: https://play.golang.org/p/KGTz2WscGY Cơ chế phản chiếu có được thông tin căn chỉnh của loại uint như thế nào? –

Các vấn đề liên quan