Câu trả lời:
Điều này là do những gì xuất hiện sau dấu hai chấm có thể là số cổng hoặc tên dịch vụ.
Sau đây là một ví dụ hợp lệ trong đó tên dịch vụ được sử dụng thay vì số cổng:
listener, err := net.Listen("tcp", "localhost:https") // port 443
// ...
Ánh xạ cổng cho một dịch vụ cụ thể có thể được tra cứu bằng cách sử dụng net.LookupPort
. Trên hệ thống Unix, /etc/services
tệp có nguồn gốc cho các ánh xạ.
Đối với một số, giá trị mặc định là 0: nếu một hàm
func (u * URL) Port () string
trả về số thay vì sting cổng sẽ là 0
Cổng 0 là một cổng dành riêng trong mạng TCP / IP, có nghĩa là nó không nên được sử dụng trong các thông điệp TCP hoặc UDP. Tuy nhiên, cổng 0 có ý nghĩa đặc biệt trong lập trình mạng, đặc biệt là lập trình ổ cắm Unix: để yêu cầu các cổng động, do hệ thống cấp phát.
nó là một nhu cầu để lập trình trong một số chức năng
url.port()
trả về một chuỗi ... nhưng GURL cũng cung cấp url.has_port()
. Vì vậy, về mặt lý thuyết, chúng ta có thể phân biệt http://example.com:/path
(có cổng, nhưng port()
là chuỗi rỗng) với http://example.com/path
(không có cổng). Tất nhiên bản thân GURL không làm điều này! Nó thậm chí còn báo cáo rằng http://example.com:80/path
"không có cổng", với lý do rằng cổng được chỉ định rõ ràng là dư thừa với lược đồ. Điều đó thật điên rồ , nhưng đừng bận tâm ... Điểm là, String
không phải Optional
. Đừng nhầm lẫn chúng.