2011-02-08 72 views
5

Tôi đã đọc qua Hướng dẫn Go và Go hiệu quả cũng như một số nguồn, nhưng cơ chế chính xác đằng sau cú pháp interface {} là Go có phần hơi bí ẩn đối với tôi. Lần đầu tiên tôi nhìn thấy nó khi cố gắng để thực hiện heap.Interface và nó có vẻ là một container của một số loại (nhắc nhở tôi về một monad một chút) mà từ đó tôi có thể trích xuất các giá trị của loại tùy ý.Vai trò của cú pháp "interface {}" trong Go là gì?

Tại sao lại được viết để sử dụng? Có một số loại workaround cho generics? Có cách nào thanh lịch hơn để nhận các giá trị từ một số heap.Interface hơn là phải bỏ qua chúng với heap.Pop(&h).(*Foo) (trong trường hợp của một con trỏ heap để nhập Foo) không?

Trả lời

7

interface{} là một hộp chung chung có thể chứa mọi thứ. Giao diện trong đi xác định một tập hợp các phương thức và bất kỳ loại nào thực hiện các phương thức này đều phù hợp với giao diện. interface{} xác định không có phương pháp nào và do đó theo định nghĩa, mọi loại đơn đều tuân theo giao diện này và do đó có thể được giữ trong một giá trị loại interface{}.

Nó không thực sự giống như generics cả. Thay vào đó, đó là một cách để thư giãn hệ thống kiểu và nói "bất kỳ giá trị nào cũng có thể được chuyển đến đây". Tương đương trong C cho chức năng này là con trỏ void *, ngoại trừ trong Go, bạn có thể truy vấn loại giá trị đang được giữ.

+0

Ahh, đó là một loại ẩn danh! OK, cảm ơn! Tôi đoán tôi sẽ sử dụng một số loại phản ánh để truy vấn loại được giữ. Tôi chưa từng làm việc với phần đó; cho đến nay tôi đã chỉ sử dụng cú pháp (lẻ, với tôi) '. ()' để lấy lại các giá trị. –

+0

Có một gói phản ánh có thể cho phép bạn truy vấn loại hoặc bạn có thể sử dụng công tắc loại, trông giống như công tắc thông thường nhưng các trường hợp là loại. Hoặc bạn chỉ có thể sử dụng phiên bản không xác thực của xác nhận loại (ví dụ: 'value, ok: = foo. (Type)') –

1

Dưới đây là một số tuyệt vời blog post giải thích những gì đang diễn ra dưới mui xe.

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