获取本地的ip时 顺便学习了下标准库net中的实现
在net/interface.go中进行了入口调用,返回值为Addr的slice
func InterfaceAddrs() ([]Addr, error) {
ifat, err := interfaceAddrTable(nil)
if err != nil {
err = &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
}
return ifat, err
}
具体平台实现interfaceAddrTable代码见net/interface_arch.go
以linux的为例在net/interface_linux.go中进行了实现
func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
tab, err := syscall.NetlinkRIB(syscall.RTM_GETADDR, syscall.AF_UNSPEC)
if err != nil {
return nil, os.NewSyscallError("netlinkrib", err)
}
msgs, err := syscall.ParseNetlinkMessage(tab)
if err != nil {
return nil, os.NewSyscallError("parsenetlinkmessage", err)
}
var ift []Interface
if ifi == nil {
var err error
ift, err = interfaceTable(0)
if err != nil {
return nil, err
}
}
ifat, err := addrTable(ift, ifi, msgs)
if err != nil {
return nil, err
}
return ifat, nil
}
返回值为Addr的slice
Addr是一个包含IP和Mask的struct类型net.IPNet的slice
其他知识点
字符串转IP类型,支持IPv4和IPv6,IP类型转字符串
var ip net.IP
ip_str := "192.168.1.1"
ip = net.ParseIP(ip_str)
ip_str2 := ip.String()
func (ip IP) String() string
判断ip是否在该网卡段内
func (n *IPNet) Contains(ip IP) bool
结束