Można użyć portu 0
wskazać nie jesteś podając dokładną portu ale chcesz darmowy, dostępny port wybrany przez system:
http.ListenAndServe(":0", nil)
Problem polega na tym, że nie będzie można ustalić, który port został przypisany. Więc trzeba stworzyć net.Listener
samodzielnie (przy użyciu funkcji net.Listen()
) i ręcznie przekazać go do 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))
Przykâadowa:
Using port: 42039
Jak widać, można uzyskać dostęp do przypisanego portu od net.Listener
, z adresu net.Addr
(uzyskanego za pomocą metody Addr()
). net.Addr
bezpośrednio nie dać dostęp do portu, ale ponieważ stworzyliśmy net.Listener
użyciu tcp
strumień w sieci, to net.Addr
będzie dynamicznego typu *net.TCPAddr
(który możemy nabyć z type assertion), który jest struct i ma pole Port int
.
Pamiętaj, że jeśli nie potrzebujesz portu w aplikacji (np. Chcesz go sam wyświetlić), nie potrzebujesz potwierdzenia typu, możesz po prostu wydrukować listener.Addr()
(który będzie zawierał port koniec):
fmt.Println("Address:", listener.Addr())
Przykâadowa:
Address: [::]:42039
również nie zapomnij do obsługi zwracanych błędów (http.ListenAndServe()
w tym przypadku). W moim przykładzie po prostu przekazałem go do panic()
, ponieważ blokuje wszystko, jeśli wszystko idzie dobrze (więc zwracają się tylko wtedy, gdy wystąpił błąd, który przekazuję do panic()
).
Bardzo dobrze wyjaśniono, Dzięki, że pracował dla mnie. –