ภาษา Go มีฟังก์ชัน / วิธีการทำงานมากเกินไปหรือไม่?


127

ฉันกำลังย้ายไลบรารี C ไปที่ Go ฟังก์ชัน AC (พร้อม varargs) ถูกกำหนดไว้ดังนี้:

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

ดังนั้นฉันจึงสร้างฟังก์ชัน wrapper C:

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

ถ้าฉันกำหนดฟังก์ชันใน Go เช่นนี้:

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)))
}

คอมไพเลอร์ Go บ่นว่า:

*Easy·SetOption redeclared in this block

Go สนับสนุนฟังก์ชัน (วิธีการ) ที่มากเกินไปหรือข้อผิดพลาดนี้หมายถึงอย่างอื่นหรือไม่?

คำตอบ:


165

ไม่มันไม่

ดูไปภาษาคำถามที่พบบ่อยและโดยเฉพาะส่วนที่เกี่ยวกับการบรรทุกเกินพิกัด

วิธีการจัดส่งจะง่ายขึ้นหากไม่จำเป็นต้องทำการจับคู่ประเภทด้วย ประสบการณ์กับภาษาอื่นบอกเราว่าการมีวิธีการที่หลากหลายที่มีชื่อเดียวกัน แต่ลายเซ็นต่างกันมีประโยชน์ในบางครั้ง แต่อาจทำให้สับสนและเปราะบางในทางปฏิบัติได้เช่นกัน การจับคู่ตามชื่อเท่านั้นและต้องมีความสอดคล้องกันในประเภทเป็นการลดความซับซ้อนในการตัดสินใจที่สำคัญในระบบประเภทของ Go

ปรับปรุง: 2016-04-07

แม้ว่า Go จะยังไม่มีฟังก์ชันที่โอเวอร์โหลด (และอาจจะไม่มี) คุณลักษณะที่มีประโยชน์ที่สุดของการโอเวอร์โหลดคือการเรียกใช้ฟังก์ชันที่มีอาร์กิวเมนต์ที่เป็นทางเลือกและค่าเริ่มต้นที่อนุมานสำหรับการละเว้นเหล่านั้นสามารถจำลองได้โดยใช้ฟังก์ชันตัวแปรซึ่งได้รับการเพิ่มเข้ามา แต่สิ่งนี้มาพร้อมกับการสูญเสียการตรวจสอบประเภท

ตัวอย่างเช่นhttp://changelog.ca/log/2015/01/30/golang



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.