likes
comments
collection
share

Golang底层原理解析(2)—— gostringnocopy 函数名真长

作者站长头像
站长
· 阅读数 15

生命不息,学习不止

题外话

今天周二了,美好的一天从阳光明媚开始的,今天早上上班,路过一个小区,站满了大白,还有急救车,估计是有疫情了,最近掘友们要注意啊,带好口罩,保护自己也保护他人

废话不多说,上货

Golang底层原理解析(2)—— gostringnocopy 函数名真长

gostringnocopy

上回讲了一下string的底层和涉及到的结构,并提到了gostringnocopy方法,如下

Golang底层原理解析(2)—— gostringnocopy 函数名真长

通过这个方法就能明白我们创建字符的时候其实是通过该方法将底层byte转换为string

今天就来解析一下这个函数,

首先是函数名,nocopy,也就是指没有拷贝,这里的没有拷贝是指字符串的创建过程中没有发生的copy情况

这个copy情况其实是指数据被拷贝到新的内存地址,这个会在后面演示

然后便是构建 stringStrut ,这个在上回已经讲了,然后转换为字符串,最终输出

这里面涉及到了两个函数unsafe.Pointer()和findnull()

findnull()

这个函数底层主要代码是一个for循环,会根据平台类型来计算字符串长度,就是GOOS的设置,对应编译后二进制文件的类型,arm,linux,mips等

unsafe.Pointer()

这个函数应该都不陌生,我们做类型转换的时候经常用到,unsafe.Pointer 可以认为是一种任意类型的指针,他可以包含大多数类型变量的地址(类型java中的object和c语言中的void* 指针)

我们使用他的主要功能包含两个,一个是将普通类型的指针转换为unsafe.Pointer类型指针,另一个则是将unsafe.Pointer转换为基本类型的指针

很像哨兵的感觉,同时支持判断是否为nil,但无法通过* 来取值,因为编译器无法确定其真正的数据类型

你以为结束了

下一篇我们讲一下unsafe.Pointer的使用和unsafe包的其他函数

Golang底层原理解析(2)—— gostringnocopy 函数名真长

大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划! Golang底层原理解析(2)—— gostringnocopy 函数名真长