Sen tam bir bağlantı noktası belirterek değiliz ama sistem tarafından seçilen bir serbest, mevcut liman istiyorum belirtmek için bağlantı noktasını 0
kullanabilirsiniz:
http.ListenAndServe(":0", nil)
Buradaki sorun, hangi bağlantı noktasının atandığını öğrenemeyeceğinizdir. Gördüğünüz gibi
Using port: 42039
, atanmış bağlantı noktasını erişebilirsiniz:
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))
Örnek çıktı: Yani http.Serve()
iletecek elle net.Listener
Kendinizi (net.Listen()
işlevini kullanarak) oluşturun ve gerek net.Listener
'dan, net.Addr
adresinden (Addr()
yöntemiyle satın alınır). net.Addr
doğrudan bağlantı noktasına erişimi vermez, ama biz net.Listener
tcp
ağ akışı kullanılarak oluşturulan bu yana, net.Addr
bir yapı olup bir alan Port int
sahiptir (biz type assertion ile elde edebilirsiniz) dinamik tip *net.TCPAddr
ait olacaktır.
Uygulamanızda bağlantı noktasına ihtiyacınız yoksa (örn. Yalnızca kendiniz görüntülemek istiyorsanız), tür onayına ihtiyacınız yoktur, yalnızca listener.Addr()
numaralı belgeyi yazdırabilirsiniz. sonu):
fmt.Println("Address:", listener.Addr())
Örnek çıkışı:
Address: [::]:42039
Bu durumda da (http.ListenAndServe()
) iade hataları işlemek için unutma. Örneğimde her şey yolunda giderse http.LitenAndServe()
ve http.Serve()
bloklarını bloke ettiğim için panic()
'a aktardım (böylece panic()
'a geçen bir hata varsa geri dönerler).
Çok iyi açıklandı, teşekkürler benim için çalıştı. –