Ngôn ngữ Go có nạp chồng hàm / phương thức không?


127

Tôi đang chuyển thư viện C sang Go. Hàm AC (với varargs) được định nghĩa như thế này:

curl_easy_setopt(CURL *curl, CURLoption option, ...); 

Vì vậy, tôi đã tạo các hàm wrapper C:

curl_wrapper_easy_setopt_str(CURL *curl, CURLoption option, char* param);
curl_wrapper_easy_setopt_long(CURL *curl, CURLoption option, long param);

Nếu tôi định nghĩa hàm trong Go như thế này:

func (e *Easy)SetOption(option Option, param string) {
    e.code = Code(C.curl_wrapper_easy_setopt_str(e.curl, C.CURLoption(option), C.CString(param)))
}

func (e *Easy)SetOption(option Option, param long) {
    e.code = Code(C.curl_wrapper_easy_setopt_long(e.curl, C.CURLoption(option), C.long(param)))
}

Trình biên dịch Go phàn nàn:

*Easy·SetOption redeclared in this block

Vậy Go có hỗ trợ quá tải hàm (phương thức) không, hay lỗi này có nghĩa là gì khác?

Câu trả lời:


165

Không nó không.

Xem Câu hỏi thường gặp về ngôn ngữ Go và cụ thể là phần về quá tải .

Việc gửi phương thức được đơn giản hóa nếu nó cũng không cần thực hiện đối sánh kiểu. Kinh nghiệm với các ngôn ngữ khác cho chúng tôi biết rằng có nhiều phương pháp có cùng tên nhưng chữ ký khác nhau đôi khi hữu ích nhưng nó cũng có thể gây nhầm lẫn và dễ hỏng trong thực tế. Chỉ khớp theo tên và yêu cầu sự nhất quán trong các loại là một quyết định đơn giản hóa chính trong hệ thống loại của cờ vây.

Cập nhật: 2016-04-07

Mặc dù Go vẫn không có các hàm quá tải (và có lẽ sẽ không bao giờ), tính năng hữu ích nhất của quá tải, đó là gọi một hàm với các đối số tùy chọn và suy ra các giá trị mặc định cho những hàm bị bỏ qua có thể được mô phỏng bằng một hàm variadic, từ đó đã được thêm vào. Nhưng điều này dẫn đến việc mất kiểm tra kiểu.

Ví dụ: http://changelog.ca/log/2015/01/30/golang



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.