pointers - 为什么从 net.Interfaces 打印错误会使我的程序崩溃?
问题描述
我正在尝试获取我机器上的系统接口列表,我正在使用 net 包,它在此处定义。
我有一小段代码,它在尝试打印错误时崩溃,我无法弄清楚为什么错误会出现在我身上。它应该返回一个错误,或者 nil 对吗?
我已经用 sudo、root 和普通用户帐户运行了这段代码,我认为这可能是网络接口的权限问题,但它在所有用户级别中都存在。
package main
import (
"net"
"fmt"
)
func main() {
var err error
var interfaces []net.Interface
var ifString []string
interfaces, err = net.Interfaces()
fmt.Printf("%v",interfaces)
if err != nil {
for _, v := range interfaces {
ifString = append(ifString, v.Name)
}
} else {
fmt.Printf(err.Error())
ifString = append(ifString, "unable to get system interfaces")
}
}
go build
程序运行和执行时输出如下:
[{1 65536 lo up|loopback} {2 1500 eno1 b8:cc:3c:8e:d4:d3 up|broadcast|multicast} {9 1500 tun0 up|pointtopoint|multicast}]
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x4a5269]
goroutine 1 [running]:
main.main()
/home/andrew/interface/borked.go:20 +0x269
解决方案
您正在收到一个 nil 指针取消引用,因为这正是您正在做的事情。
鉴于代码中的以下 if 语句:
if err != nil {
for _, v := range interfaces {
ifString = append(ifString, v.Name)
}
} else {
fmt.Printf(err.Error())
...
}
当为 nilelse
时达到。err
然而,您正试图访问其中的一个字段:err.Error()
,取消引用一个 nil 指针。
您需要颠倒您的if
陈述,这是错误的方法。
推荐阅读
- bing-translator-api - 为什么微软必应翻译没有出现在网站上
- javascript - 如何在 AngularJS 类中添加 $watch 以进行表单验证
- mysql - 比较 2 个 MYSQL 表并根据条件插入或更新 - 100 万条记录
- html - 使这个 CSS 绘图具有响应性
- windows - Visual Studio 安装日志位置 (2019+)
- python-3.x - N 应该划分多少个数的总和
- laravel - Laravel - 主管只能查看他们的部门数据
- android - Kotlin Multiplatform - 从目录中获取文件列表
- c++ - 如何正确安装 ZMQ?
- java - 如何在 map-reduce 中为不同的拆分设置不同的内存配置?