分析golang中的icmp消息时出现问题
我是Golang的新手,尝试着做一件看起来很简单的事情——发送一个包含一些文本的ping,当我收到回复时再阅读这些文本,但我遇到了一些我不明白的事情。我创建了一个类似这样的ping:分析golang中的icmp消息时出现问题,go,icmp,Go,Icmp,我是Golang的新手,尝试着做一件看起来很简单的事情——发送一个包含一些文本的ping,当我收到回复时再阅读这些文本,但我遇到了一些我不明白的事情。我创建了一个类似这样的ping: ping := icmp.Message{ Type: ipv4.ICMPTypeEcho, Code: 0, Body: &icmp.Echo{ ID: os.Getpid() & 0xffff, Seq: 1, Data:
ping := icmp.Message{
Type: ipv4.ICMPTypeEcho,
Code: 0,
Body: &icmp.Echo{
ID: os.Getpid() & 0xffff,
Seq: 1,
Data: []byte("Hello"),
},
}
以下是上下文的套接字读取部分:
buf := make([]byte, 1500)
_, peer, err := c.ReadFrom(buf)
message, err := icmp.ParseMessage(1, buf)
以下是我从邮件正文中取回数据的失败尝试:
body := message.Body;
fmt.Println("body.ID ", body.ID)
fmt.Println("body.Seq ", body.Seq)
fmt.Println("body.Data ", string(body.Data))
Go在构建时不快乐:
./ping.go:86: body.ID undefined (type icmp.MessageBody has no field or method ID)
./ping.go:87: body.Seq undefined (type icmp.MessageBody has no field or method Seq)
./ping.go:88: body.Data undefined (type icmp.MessageBody has no field or method Data)
然而,此代码改编自,其工作原理如下:
switch body := message.Body.(type) {
case *icmp.Echo:
fmt.Println("body.ID ", body.ID)
fmt.Println("body.Seq ", body.Seq)
fmt.Println("body.Data ", string(body.Data))
default:
fmt.Println("not a *icmp.Echo")
}
Go非常乐意编译和运行这段代码。有人能告诉我为什么类型开关中的代码工作正常,但第一个示例会导致编译错误。谢谢大家!
message.Body
是一种接口类型的MessageBody
()。如果需要基础类型,则需要强制转换它。一种方法是说
body := message.Body.(*icmp.Echo)
...
这可能对您有效,但如果MessageBody
不是icmp.Echo
指针,则会导致死机
类型开关确保没有死机
你也可以这样做
if body, ok := message.Body.(*icmp.Echo); ok {
// do something with Body as an *icmp.Echo type
}
防止恐慌。
message.Body
是一种接口类型的MessageBody
()。如果需要基础类型,则需要强制转换它。一种方法是说
body := message.Body.(*icmp.Echo)
...
这可能对您有效,但如果MessageBody
不是icmp.Echo
指针,则会导致死机
类型开关确保没有死机
你也可以这样做
if body, ok := message.Body.(*icmp.Echo); ok {
// do something with Body as an *icmp.Echo type
}
为了防止恐慌