Мне ничего не известно.
Но я думаю, что ваш код следует немного изменить. Итак, вы возвращаетесь в случае какой-либо ошибки, не принимая во внимание, что, если вы уже проверили правильный интерфейс, вы можете получить правильный результат. Что ж, при проверке нескольких интерфейсов ошибка может быть вызвана любой причиной, и вы должны ввести их и позволить l oop продолжить проверку и всех других интерфейсов.
Также во время тестирования функции, которую я написал ниже: немного более высокая производительность:
goos: darwin
goarch: amd64
BenchmarkRetrieveInterfaceFromIP-8 15768 75635 ns/op 16336 B/op 254 allocs/op
BenchmarkGetInterfaceByIP-8 16748 71968 ns/op 16192 B/op 244 allocs/op
Примечание: BenchmarkGetInterfaceByIP
- это тест для моей функции, а BenchmarkRetrieveInterfaceFromIP
- это тест для вашей функции.
func getInterfaceByIP(ip net.IP) (string, error) {
interfaces, err := net.Interfaces()
if err != nil {
return "", err
}
for _, iface := range interfaces {
if addrs, err := iface.Addrs(); err == nil {
for _, addr := range addrs {
if iip, _, err := net.ParseCIDR(addr.String()); err == nil {
if iip.Equal(ip) {
return iface.Name, nil
}
} else {
continue
}
}
} else {
continue
}
}
return "", errors.New("couldn't find a interface for the ip")
}
И да, я думаю, что люди, использующие C / C ++ , делают аналогичные вещи, потому что из одного из ответов, которые я видел, связанных с аналогичным вопросом (для C
), они кредитное плечо от getifaddrs (3) , что аналогично тому, что мы сделали. [Ссылка]