什么是rune类型?
rune类型是Go语言的一种特殊数字类型,在builtin/builtin.go文件中,它的定义为:type rune = int32;官方对它的解释是:rune是类型int32的别名,在所有方面都等价于它,用来区分字符值跟整数值。由于Go语言中采用的是统一的UTF-8编码,英文字母在底层占1个字节,特殊字符和中文汉字则占用1~3个字节,在Go语言中文的计数和截取并不如其他语言(比如Python)那么容易,所以Go提供了rune类型来处理中文的计数和分割问题,以支持国际化多语言。
Go
//示例:
package main
import "fmt"
func main() {
s := "阿福Chris"
fmt.Println(len(s)) //输出11
fmt.Println(len([]rune(s))) //输出7
}
从上面的例子可以看出,我们使用len函数取带有中文的字符串长度时,获得的并不是真正的字符个数,当然如果全都是英文是不存在这个问题的;在上面例子中,由于有中文,就影响到了对长度的正确衡量,此时,我们使用rune进行转换,便可以获得正确的长度
为什么uint类型溢出?
当 uint 类型的值超过其最大值时,它会发生溢出,然后从该类型的最小值开始循环。 为了解决这个问题,我们可以采取以下几种方法: 使用更大的数据类型:例如,如果你正在使用 uint32 ,你可以尝试升级到 uint64 。 这将提供更大的值范围,从而减少溢出的可能性
Golong的uint类型溢出问题通常会发生在大量的运算中,特别是涉及到大量循环和大数运算中。当uint类型的值超过其最大值时,会发生溢出,从最小值开始循环,一般有如下几种解决办法:
- 使用更大的数据类型:
例如,如果正在使用uint32,则可以尝试改为使用uint64。这将提供更大的范围,减少溢出的可能性。
- 添加溢出检查:
在每次运算之后,可以检查结果是否小于某一操作数(假设只在正数上进行操作)。例如:
Go
func addUint32(a, b uint32) (uint32, error) {
res := a + b
if res < a || res < b {
return 0, errors.New("uint32 overflow")
}
return res, nil
}
uintptr和unsafe.Pointer的区别?
uintptr 是一种整数类型, unsafe . Pointer 是一种指针类型。 uintptr 可以进行算术运算, unsafe . Pointer 不可以进行算术运算。 uintptr 不会被GC 识别和追踪, unsafe . Pointer 会被GC 识别和追踪。
分享这个文章:
golang uintptr和unsafe.Pointer的区别-CSDN博客
Golang多返回值怎么实现?
Golang中怎么解析tag?反射原理是什么?
怎么解析tag:
图解go反射实现原理 [ 菜刚RyuGou的博客 ] RyuGou的博客https://i6448038.github.io/2020/02/15/golang-reflection/