Bạn có thể sử dụng cổng 0
để chỉ ra bạn không chỉ định một cổng chính xác nhưng bạn muốn có một miễn phí, cổng có sẵn bởi hệ thống chọn:
http.ListenAndServe(":0", nil)
Vấn đề với điều này là bạn sẽ không thể tìm ra cổng nào được gán. Vì vậy, bạn cần phải tạo ra các net.Listener
mình (sử dụng net.Listen()
chức năng), và tự vượt qua nó để http.Serve()
:
listener, err := net.Listen("tcp", ":0")
if err != nil {
panic(err)
}
fmt.Println("Using port:", listener.Addr().(*net.TCPAddr).Port)
panic(http.Serve(listener, nil))
Ví dụ đầu ra:
Using port: 42039
Như bạn thấy, bạn có thể truy cập vào cổng được gán từ số net.Listener
, từ địa chỉ net.Addr
(được mua theo phương thức Addr()
). net.Addr
không trực tiếp cấp quyền truy cập vào cổng, nhưng vì chúng tôi đã tạo net.Listener
sử dụng luồng mạng tcp
, net.Addr
sẽ thuộc loại động *net.TCPAddr
(chúng tôi có thể có được type assertion), cấu trúc và có trường Port int
. Lưu ý rằng nếu bạn không cần cổng trong ứng dụng của bạn (ví dụ như bạn chỉ muốn hiển thị nó cho chính mình), bạn không cần xác nhận kiểu, bạn có thể chỉ cần in listener.Addr()
(sẽ chứa cổng tại địa chỉ này). Quay lại đầu trang cuối):
fmt.Println("Address:", listener.Addr())
Ví dụ đầu ra:
Address: [::]:42039
Cũng đừng quên để xử lý các lỗi trả lại (http.ListenAndServe()
trong trường hợp này). Trong ví dụ của tôi, tôi chỉ cần chuyển nó đến panic()
vì http.LitenAndServe()
và http.Serve()
chặn nếu mọi thứ suôn sẻ (vì vậy, chúng chỉ trả về nếu có lỗi, tôi chuyển đến panic()
).
Rất tốt giải thích, Cảm ơn đã làm việc cho tôi. –