~~~
以上 如果不写这个判断 默认直接输出a[0] 得到的是本地连接** ,正常的 按序号排列
但是我想加个 在判断下是否 网卡可用的时候 就出现了问题了 一直输出 否则!
if a[i].Flags == net.FlagUp
这句不就是判断 遍历的时候 先检测这个网卡是否正常 吗?
a, err := net.Interfaces()
if err != nil {
fmt.Println(err)
return
}
for i := 0; i < len(a); i++ {
if a[i].Flags == net.FlagUp {
fmt.Println(a[i].Name, a[i].HardwareAddr)
} else {
fmt.Println("哎呀 什么也没有!")
}
}
~~~
```
const (
FlagUp Flags = 1 << iota // interface is up
FlagBroadcast // interface supports broadcast access capability
FlagLoopback // interface is a loopback interface
FlagPointToPoint // interface belongs to a point-to-point link
FlagMulticast // interface supports multicast access capability
)
```
这个定义只是针对网卡的一个属性,属性标识,但是每个网卡是由很多属性的,比如一般都有multicast + broadcast,那么就是1*2^1 + 1*2^4 = 18 = 0x12
如果要判断网卡是否开启,因为这里面只有 FlagUp 是奇数,只要网卡开启就会加上这个奇数结果也为奇数,那么就可以通过
```
if a[i].Flags % 2 != 0 {
//网卡up
} else {
//网卡down
}
```
另一种判断是通过String()
```
if strings.Contains(a[i].Flags.String(), "up") {
//网卡up
} else {
//网卡down
}
``
#1
更多评论
```
interfaces, err := net.Interfaces()
if err != nil {
log.Info("Can not get local interface info:%s", err)
os.Exit(-1)
}
for _, inter := range interfaces {
flags := inter.Flags.String()
if strings.Contains(flags, "up") && strings.Contains(flags, "broadcast") {
mac_address = append(mac_address, inter.HardwareAddr.String())
}
}
```
mac_address 应该可以拿到有效的网卡地址
一般来说,对于服务器而言,只会有一个网卡处于 up 且 broadcast 状态。
#2