Skip to content

Instantly share code, notes, and snippets.

@padurean
Last active July 23, 2020 19:26
Show Gist options
  • Save padurean/1061362c7443610f07660fcb528b3d4e to your computer and use it in GitHub Desktop.
Save padurean/1061362c7443610f07660fcb528b3d4e to your computer and use it in GitHub Desktop.
Two ways to get the current local IP in Go #Golang
package main
import (
"errors"
"fmt"
"net"
)
func main() {
localIP, err := getLocalIPFromNetInterfaces()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("%-32s : %s\n", "Local IP from network interfaces", localIP)
localIP, err = getLocalIPByUDPDialing()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("%-32s : %s\n", "Local IP from UDP dial", localIP)
}
func getLocalIPFromNetInterfaces() (string, error) {
ifaces, err := net.Interfaces()
if err != nil {
return "", err
}
for _, iface := range ifaces {
if iface.Flags&net.FlagUp == 0 {
continue // interface down
}
if iface.Flags&net.FlagLoopback != 0 {
continue // loopback interface
}
addrs, err := iface.Addrs()
if err != nil {
return "", err
}
for _, addr := range addrs {
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip == nil || ip.IsLoopback() {
continue
}
ip = ip.To4()
if ip == nil {
ip = ip.To16()
if ip == nil {
continue
}
}
return ip.String(), nil
}
}
return "", errors.New("this machine is not connected to a network")
}
func getLocalIPByUDPDialing() (string, error) {
// UDP connection => there is no handshake => also works if offline
conn, err := net.Dial("udp", "1.2.3.4:1")
if err != nil {
return "", err
}
defer conn.Close()
localAddr := conn.LocalAddr().(*net.UDPAddr)
return localAddr.IP.String(), nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment