numeric types
数字类型包括整型和浮点型,内置的和系统无关的数字类型包括
- uint8:8位无符号整型(0 to 255)
- uint16:16位无符号整型(0 to 65535)
- uint32:32位无符号整型(0 to 4294967295)
- uint64:64位无符号整型(0 to 18446744073709551615)
- int8:8位有符号整型(-128 to 127)
- int16:16位有符号整型(-32768 to 32767)
- int32:32位有符号整型(-2147483648 to 2147483647)
- int64:64位有符号整型(-9223372036854775808 to 9223372036854775807)
- float32:32位浮点类型
- float64:64位浮点类型
- complex32:由float32实部+虚部
- complex64:由float64实部+虚部
- byte:uint8的别名
- rune:nt32的别名
和系统有关的类型有:
- uint:32位操作系统上就是uint32,64位操作系统上就是uint64
- int:32位操作系统上就是int32,64位操作系统上就是int64
byte和rune类型
组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符:
var a := '中'
var b := 'x'
Go 语言的字符有以下两种:
- uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
- rune类型,代表一个 UTF-8字符。
当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32。
字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
修改字符串:
要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。
func changeString() {
s1 := "big"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1))
s2 := "白萝卜"
runeS2 := []rune(s2)
runeS2[0] = '红'
fmt.Println(string(runeS2))
}
类型转换
一、显式类型转换
这种类型转换主要在切换同一基础类型不同精度范围时使用,比如我们要将 int 型转为 int64 类型时。
func sqrtDemo() {
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是float64类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}
该类型转换要注意的是:类型被转换后会损失精度
二、断言(assert)
断言,顾名思义就是果断的去猜测一个未知的事物。在 go 语言中,interface{} 就是这个神秘的未知类型,其断言操作就是用来判断 interface{} 的类型。
var foo interface{} = 22
f, ok := foo.(int)
if !ok {
fmt.Println("Guess wrong ...")
}
fmt.Printf("The type is : %T", f)
三、取指针和解指针
通过符号 & 、* 可以实现指针与其所对应值的切换
func Test(t *testing.T) {
p := Person{
Name: "bar",
Age: 7,
}
per := &p
t.Logf("The type of per is : %T \n", per)
t.Logf("After operation , type is : %T", *per)
}
& 可以轻松的将某类型 T 转化为 T 的指针类型(*T),* 可轻松实现解指针,将某一类型的指针转化为该指针指向的值的类型。