关于Golang指针,为什么?

时间:2017-11-16 06:40:14

标签: go

发生了什么事?

<error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/error/404.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/error/500.jsp</location>
</error-page>
<error-page>
    <location>/error.html</location>
</error-page>

我的问题是为什么* pf不等于* pn和错误?

感谢您的回复。

3 个答案:

答案 0 :(得分:3)

  1. n属于interface{}类型,因此在内存中它由2个值的结构表示:类型和数据。类型是第一位的。所以你取消引用它并解释为数字。

  2. *pf = 9打破了这种结构,所以下次尝试取消引用时 - 运行时会失败。

答案 1 :(得分:1)

为简单起见,我们认为我们有64位机器。 n是64位的2个字:第一个是指向变量的指针,第二个是指向类型信息的指针 - 所谓的itab

当你得到pn指向的值时,编译器知道你想要一个接口的值,所以它会通过第一个指针并返回int值。编译器认为pf是指向float64的指针。所以它让。您要覆盖接口n中的第一个字,但可能有一些错误的地址(等于9.0的二进制值)。下次您看到接口编译器中的值使用了错误的地址。并返回一些垃圾甚至SegFault。

这就是为什么它被称为unsafe.Pointer并且不建议使用。直到你有非常严重的问题。

答案 2 :(得分:0)

接口值包含有关其包含的数据类型的信息,然后包含实际值(或指向该值的指针)。当您将指针转换为*int64的接口时,*int64将指向接口值中的一些随机数据(现在恰好是指向该类型信息的指针,但这是允许的要改变,这部分语言不在兼容性保证范围内。当你覆盖那些数据时,事情就会中断,因为某种原因,不安全被称为不安全。

*pf不等于*pn,因为它们具有不同的类型,即使它们可能包含相同的位模式。