go学习-基本知识点

2023-09-17 15:27:55

string 转 []byte

通用的转换会发生内存拷贝,但是如下利用unsafe.Pointer实现的强转则不需要拷贝

func TestDemo(t *testing.T) {
   
	a := "aaa"
	b := "bbbbbbb"
	// ssh 是 a 的内存地址
	// 通过将字符串的底层地址强制转换成 StringHead 结构来获取字符串的底层指针和长度
	// type StringHeader struct {
   
	//    Data uintptr // 指向字符串实际内容的指针
	//    Len  int     // 字符串的长度
	// }
	ssha := *(*reflect.StringHeader)(unsafe.Pointer(&a))
	sshb := *(*reflect.StringHeader)(unsafe.Pointer(&b))
	// 使用 unsafe.Pointer 将 ssh 转换为 []byte 类型的指针
	// 然后再通过 * 运算符将其解引用,得到了一个字节切片
	// type SliceHeader struct {
   
	//    Data uintptr // 指向切片元素(字节数组)实际内容的指针
	//    Len  int     // 切片的长度
	//    Cap  int     // 切片的容量
	// }
	b1 := *(*[]byte)(unsafe.Pointer(&ssha))
	b2 := *(*[]byte)(unsafe.Pointer(&sshb))
	fmt.Printf("%v", b1)
	fmt.Printf("%v", b2)
}

内存逃逸

变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全可知。
如果变量通过了这些校验,就可以在栈上分配。否则就说它逃逸了,必须在堆上分配。

能引起变量逃逸到堆上的典型情况:

  • 在方法内把局部变量指针返回
    局部变量原本应该在栈中分配,在栈中回收。但是由于返回时被外部引用,因此其生命周期大于栈,则溢出。
  • 发送指针/发送带有指针的值到 channel
    在编译时,是没有办法知道哪个 goroutine 会在 channel 上接收数据。
    所以编译器没法知道变量什么时候才会被释放。
  • 在一个切片上存储指针或带指针的值
    一个典型的例子就是 []*string 。这会导致切片的内容逃逸。
    尽管其后面的数组可能是在栈上分配的,但其引用的值一定是在堆上。
  • slice 的背后数组被重新分配
    因为 append 时可能会超出其容量( cap )。
    slice 初始化的地方在编译时是可以知道的,它最开始会在栈上分配。
    如果切片背后的存储要基于运行时的数据进行扩充,就会在堆上分配。
  • 在 interface 类型上调用方法
    在 interface 类型上调用方法都是动态调度,方法的真正实现只能在运行时知道
更多推荐

TS同时打包和监视所有ts文件或只指定ts文件

当我们项目中ts文件较多时,我们如何直接打包所有ts文件为js文件?而不是使用tsc文件名一个一个去打包文件一、配置tsconfig.json文件创建一个tsconfig.json文件,该文件中不需要配置任何信息二、控制台输入打包命令在控制台输入如下代码:tsc三、对所有ts文件进行监听但是我们并没有对文件进行监听,修

Linux各种命令-查询篇

目录查看文件内容查看存储空间查看python安装目录查Ubuntu版本查看所有文件(含隐藏文件)查IP查看内存使用情况查看GPU使用情况查看CPU使用情况​​​​​​​查看文件内容cat[选项][文件...]-n:显示行号。-b:显示非空行号。-s:合并空白行。-E:在每行结尾添加$符号。-T:将制表符显示为^I。-v

交换机端口镜像详解

交换机端口镜像是一种网络监控技术,它允许将一个或多个交换机端口的网络流量复制并重定向到另一个端口上,以便进行流量监测、分析和记录。通过端口镜像,管理员可以实时查看特定端口上的流量,以进行网络故障排查、安全审计和性能优化。以下是关于交换机端口镜像的详细介绍:工作原理:交换机端口镜像通过在交换机的配置中指定源端口和目标端口

pycharm 中package, directory, sources root, resources root的区别

【遇到的问题】导入yolov5中有utils文件,自己的代码中也有utils文件,使得yolov5中的这部分引用出错了。【解决方案】单独建立detection文件夹,把检测相关的都放在这里,yolov5是github上拉取的源码,发现yolov5中fromutilsimport...有下划线,且会认为是edgeserv

多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出

多输入多输出|MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出目录多输入多输出|MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出预测效果基本介绍程序设计往期精彩参考资料预测效果基本介绍MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出1.dat

【码银送书第七期】七本考研书籍

八九月的朋友圈刮起了一股晒通知书潮,频频有大佬晒出“研究生入学通知书”,看着让人既羡慕又焦虑。果然应了那句老话——比你优秀的人,还比你努力。心里痒痒,想考研的技术人儿~别再犹豫了。小编咨询了一大波上岸的大佬,这份备考书单给大家参考。专业课(此处特指408,全称计算机专业基础综合)知识点超级多,题目灵活,数据结构、计算机

考研408 | 【计算机组成原理】 数据的表示和运算

进位计数制十进制计数法:推广:r进制计数法任意进制-->十进制:二进制<-->八进制、十六进制:各种进制的常见书写方式:十进制-->任意进制:十进制-->二进制(拼凑法):真值和机器数:总结:BCD码总结:无符号整数的表示和运算无符号整数在计算机中的应用:无符号整数的表示:无符号整数的加法运算:无符号整数的减法运算:总

uniapp运行到IOS真机提示 错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配

参考文章:请查看是否设备未加入到证书列表或者确认证书类型是否匹配ios开发描述文件必须绑定调试设备,只有授权的设备才可以直接安装基座,所以在申请开发描述文件之前,先添加调试的IOS设备。前往网站https://developer.apple.com,在Devices中,添加手机设备UUID第一步:登录第二步:检查设备列

VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOSTSCSI设备的模拟是由QEMU和HOST共同实现的,QEMU模拟VHOSTSCSI设备配置空间等,而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。在QEMU中VHOSTSCSI设备继承关系如下:其它设备以及对应class_init函数和realize具现化实现与VIRTIO-SCSI一致,

Learn Prompt-为什么用 ChatGPT API?

引用人工智能先驱吴恩达先生说过的话:“一个系统需要的远不止一个提示(prompt)或者一个对LLM(大性语言模型)的调用。”API的优点:集成更深:通过API,您可以将ChatGPT集成到自己的系统和工作流中,实现更深层次的定制和控制。个性化的响应:您可以根据特定需求和场景调整模型的响应,例如,通过改变温度(tempe

华策影视AIGC工程师招聘; 百度大模型创业松;主流大语言模型的技术原理细节;AIGC Prompt的七个缺陷 | ShowMeAI日报

👀日报&周刊合集|🎡生产力工具与行业应用大全|🧡点赞关注评论拜托啦!🎯华策影视AIGC工程师招聘,AIGC在「文娱领域」的真正落地逛即刻时发现关注的AI博主@杨昌发布了自己公司的招聘信息,而且附上了团队氛围和工作感受等分享。华策影视是影视行业龙头企业,成立了AIGC应用研究院,重视AI且不算卷。岗位base上海

热文推荐