🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### Unsafe code **Unsafe code**是一种绕过 go 类型安全和内存安全检查的 Go 代码。大多数情况,unsafe code 是和指针相关的。但是要记住使用 unsafe code 有可能会损害你的程序,所以,如果你不完全确定是否需要用到 unsafe code 就不要使用它! Unsafe code 的使用将在 unsafe.go 程序中进行说明,该程序分为三个部分。 `unsafe.go`第一部分 ```Go package main import ( "fmt" "unsafe" ) ``` 你会注意到,为了使用 unsafe code,你将需要导入不安全的标准 Go package。 第二部分 Go 代码: ```GO func main() { var value int64 = 5 var p1 = &value var p2 = (*int32)(unsafe.Pointer(p1)) ``` 请注意此处使用`unsafe.Pointer()`函数,该函数使我们自己承担创建一个名为`p2`的`int32`指针的风险,该指针指向一个名为`value`的`int64`变量,可以使用`p1`指针对其进行访问。任何 Go 指针都可以转换为`unsafe.Pointer`。 > Tip: 类型为`unsafe.Pointer`的指针可以覆盖 Go 的类型系统。这无疑是很快的,但是如果使用不正确或不小心,也会带来危险。此外,它使开发人员可以更好地控制数据。 最后一部分 Go 代码: ```GO fmt.Println("*p1: ", *p1) fmt.Println("*p2: ", *p2) *p1 = 5434123412312431212 fmt.Println(value) fmt.Println("*p2: ", *p2) *p1 = 54341234 fmt.Println(value) fmt.Println("*p2: ", *p2) } ``` > 你可以**取消引用指针**,并使用星号(\*)获取,使用或设置其值。 如果你执行`unsafe.go`,你会得到以下的输出: ```shell $ go run unsafe.go *p1: 5 *p2: 5 5434123412312431212 *p2: -930866580 54341234 *p2: 54341234 ``` 此输出告诉我们什么?它告诉我们 32 位指针不能存储 64 位整数。 正如你将在下一节中看到的那样,`unsafe`包的功能可以用内存做更多有趣的事情。