发生了什么事?
<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和错误?
感谢您的回复。
答案 0 :(得分:3)
n
属于interface{}
类型,因此在内存中它由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
,因为它们具有不同的类型,即使它们可能包含相同的位模式。