分析golang中的icmp消息时出现问题

分析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:

我是Golang的新手,尝试着做一件看起来很简单的事情——发送一个包含一些文本的ping,当我收到回复时再阅读这些文本,但我遇到了一些我不明白的事情。我创建了一个类似这样的ping:

 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
}
为了防止恐慌