เหตุใดพอร์ตจึงเป็นสตริงและไม่ใช่จำนวนเต็ม


103

Portวิธีการส่งกลับสตริงและไม่ใช่จำนวนเต็ม สาเหตุคืออะไรและปลอดภัยหรือไม่ที่จะนำหน้าพอร์ตด้วย ":"

คำตอบ:


143

เนื่องจากสิ่งที่ปรากฏหลังเครื่องหมายจุดคู่อาจเป็นหมายเลขพอร์ตหรือชื่อบริการก็ได้

ต่อไปนี้เป็นตัวอย่างที่ถูกต้องซึ่งใช้ชื่อบริการแทนหมายเลขพอร์ต:

listener, err := net.Listen("tcp", "localhost:https") // port 443
// ...

net.LookupPortการทำแผนที่พอร์ตสำหรับบริการเฉพาะสามารถมองขึ้นโดยใช้ บนระบบ Unix /etc/servicesไฟล์มีที่มาสำหรับการแม็พ


1
ฉันมักจะรู้สึกทึ่งกับการแบ่งขั้วแบบเปิด / แบบปิด ฉันต้องการเห็นบางสิ่งบางอย่างเช่นประเภทผสมที่มีค่าเริ่มต้นบางอย่าง (ที่นี่เช่นพอร์ตและบริการที่รู้จักกันดี) แต่ยังอนุญาตให้ขยายได้ในที่สุดเพื่อรองรับการเติมข้อความอัตโนมัติ ในความรู้ในการทำงานที่ จำกัด ของฉัน TypeScripts ADTs เข้ามาใกล้ที่สุดบางที Swifts ADTs สามารถแสดงสิ่งนี้ได้โดยตรง
Stefan Hanke

0

สำหรับตัวเลขค่าเริ่มต้นคือ 0: ถ้าเป็นฟังก์ชัน

 func (u * URL) Port () string

return number แทนการต่อยพอร์ตจะเป็น 0

พอร์ต 0 เป็นพอร์ตที่สงวนไว้ในเครือข่าย TCP / IP ซึ่งหมายความว่าไม่ควรใช้ในข้อความ TCP หรือ UDP อย่างไรก็ตามพอร์ต 0 มีความสำคัญเป็นพิเศษในการเขียนโปรแกรมเครือข่ายโดยเฉพาะการเขียนโปรแกรมซ็อกเก็ต Unix: สำหรับการร้องขอพอร์ตไดนามิกที่จัดสรรโดยระบบ

จำเป็นต้องมีการเขียนโปรแกรมในหลายฟังก์ชัน


ใน libGURL, url.port()กลับสตริง ... แต่ Gurl url.has_port()นอกจากนี้ยังมี ดังนั้นในทางทฤษฎีเราสามารถแยกแยะhttp://example.com:/path(มีพอร์ต แต่port()เป็นสตริงว่าง) จากhttp://example.com/path(ไม่มีพอร์ต) แน่นอนว่า GURL เองก็ไม่ทำเช่นนี้! แม้จะรายงานว่าhttp://example.com:80/path"ไม่มีพอร์ต" เนื่องจากพอร์ตที่ระบุอย่างชัดเจนนั้นซ้ำซ้อนกับโครงร่าง ซึ่งเป็นบ้าแต่ไม่เคยใจ ... จุดคือไม่ได้String Optionalอย่าทำให้พวกเขาสับสน
Quuxplusone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.