《Go程序设计语言》- 第13章:低级编程

前言

本专栏是笔者在学习《Go程序设计语言》这本书时,对每个章节认为较为重要容易忘记👻)的知识点记录的笔记,其中也会有少量的思考👀, 现整理成博客分享出来。

如果对专栏感兴趣,跑过去看一眼,书中的每一章都有:《Go程序设计语言》笔记

❗️注意❗️:本专栏不是详细的知识讲解,只是碎片的知识条目,或可作为Go知识点查漏补缺的小工具~

  1. 对于常见无法静态检测出来的错误:数组访问越界、nil指针引用等,动态检测确保这类操作发生时终止程序并给出错误信息;
  2. 自动内存管理(垃圾回收)防止了释放后使用的bug
  3. unsafe包可以像普通包一样导入,但其实它是由编译器实现的;提供了对语言内置特性的访问功能;

unsafe.Sizeof、Alignof和Offsetof

  1. Sizeof函数返回参数在内存中占用的字节数;
  2. 当类型的值在内存中对齐时,计算机的加载和写入会很高效;对齐指起始地址是本身大小的整数倍
  3. 32位系统一个字占4字节,64位系统一个字占8字节;
  4. Alignof返回参数的对齐方式,布尔和数值类型对齐到他们的长度(最大8字节),其它类型按对齐;
  5. Offsetof输入参数xf,是成员关系,可以x.f访问;函数返回f相对于x的偏移地址;

unsafe.Pointer

  1. unsafe.Pointer可以存储任何类型的指针;它是可比较的
  2. 可转换为uintptr类型,保存地址的值,这样就可以做地址运算了;但是注意下一条的陷阱
  3. 一些垃圾回收器会移动变量以减少内存碎片,被称作移动的垃圾回收器
  4. 当将unsafe.Pointer转换为uintptr后,进行地址运算,对运算结果进行存取,或许是无意义的:垃圾回收器可能将变量移动过了;
  5. goroutine的栈是可扩展的,扩展时也可能包含变量移动,所以不能认为变量地址在生存周期中不变

示例:深度相等

使用cgo调用C代码

  1. 一个Go程序或许需要调用C实现的驱动,此时cgo登场;
  2. import "C"会促使go build工具调用cgo进行预处理;
  3. import "C"之前,使用注释来暴露C的接口,其注释内容为C的语句,如#include<xxx.h>等;
  4. 注释中还可以使用#cgo指令来指定工具链的选项,如#cgo LDFLAGS: -L/usr/lib -lbz2添加了库目录/usr/lib和库文件bz2
  5. Go代码中访问C的内容,使用C.x、C.func形式访问,即通过cgo暴露的C代码,均在C作用域内
  6. 也可以反过来将Go代码编译为静态库、动态库,然后通过C程序来加载和共享;具体参考官网

关于安全的注意事项

  1. 大多数程序员永远都不需要使用unsafe包;
  2. 避免使用reflectunsafe

如有错误 ❌ ,欢迎指正 ☝️~

如有收获 🍗,可以考虑点赞👍/评论💬/收藏⭐️/关注👀,大家共同进步~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值