Skip to content

Go 语言笔记:基础数据类型

布尔型

布尔型的值是常量的 true 或者 false, 默认值是 false

go
var flag bool
var isMale bool = true
var isFemale = false

数字类型

数字类型分为 intuintfloatcomplexbyteruneuintptr

整型

整型主要分为 intuint 两大类,详见表格如下

类型有无符号范围
uint8无符号 8 位整型0--255
uint16无符号 16 位整型0--65535
uint32无符号 32 位整型0--4294967295
uint64无符号 64 位整型0--18446744073709551615
int8有符号 8 位整型-128--127
int16有符号 8 位整型-32768--32767
int32有符号 8 位整型-2147483648--2147483647
int64有符号 8 位整型-9223372036854775808--9223372036854775807

特殊整型

Go 对于 intuint 这两种在不同平台的实现不一样,

类型描述
uint32 位操作系统上就是 uint32,64 位操作系统上就是 uint64
int32 位操作系统上就是 int32,64 位操作系统上就是 int64
uintptr无符号整型,用于存放一个指针

在使用 intuint 类型时,不能假定它是 32 位还是 64 位,应考虑其在不同平台上的差异化。

字符类型

Go 语言中单个字符有两种,一种是代表 ASCII码,一种是代表 UTF-8 字符

  • byteuint8 的别名,等同之,主要区别是 byte 用来标识 ASCII码 字符, 而 uint8 标识数字
  • runeint32 的别名,等同之,主要区别是 byte 用来标识 UTF-8 字符, 而 uint8 标识数字
go
package main

import "fmt"

func main() {
    str := "hello, 柠檬"
    println(len(str))
    
    // 打印 ASCII 码长度,使用 len 函数取长度
    for i := 0; i < len(str); i++ {
    	print(string(str[i]))
    }
    
    // 打印出 unicode 字符,使用 range 函数取长度
    for i, s := range str {
        print(i, "=", s, "\n")
    }
}

打印结果:

13
hello, 柠檬
unicode: 0 h
unicode: 1 e
unicode: 2 l
unicode: 3 l
unicode: 4 o
unicode: 5 ,
unicode: 6  
unicode: 7 柠
unicode: 10 檬

可以看到这里的长度 13 和我们普遍认为字符串的长度 9 不一样,是因为 len 函数默认是以 ASCII 码的方法统计长度,可以认为统计的是字节长度。 这样打印出来的中文是乱码,此时拿到的字符类型是 ASCII 码,其代表不了中文字符,可以使用 range 函数遍历打印出中文,可以看到 "柠檬" 这两个中文字符各占 3 个字节。 但此时长度也不是我们认为的 9,依然是 13,这里打印的是下标 i。总结,len 函数可以用来获取切片、字符串、通道(channel)的长度,区别是对于字符串,len 统计的字符串的 byte 个数, 而中文是以 UTF-8 格式存储的,UTF-8 是一种变长的编码方法,字符长度从 2 个字节到 4 个字节不等,因此当含有中文的字符串,统计其长度应使用如下的方式:

go
package main

import (
    "strings"
    "unicode/utf8"
)

func main() {
    str := "hello, 柠檬"

    // 方式一,将字符串转换成 rune
    r := []rune(str)
    println(len(r)) // 9
    
    // 方式二,使用内置包 unicode/utf8 中的函数
    println(utf8.RuneCountInString(str))
    
    // 方式二,使用内置包 strings 中的函数
    println(strings.Count(str, "") - 1)
}

浮点型

通常情况下应该优先选择 float64, 因为 float32 能精确表示的整数位并不是很大,且累计计算误差很容易超过最大值。

类型范围
float32IEEE-754 32位浮点型数
float64IEEE-754 64位浮点型数

复数类型

Go 中存在复数的概念,复数由三部分组成 RE + IMi, 其中 RE 和 IM 分别表示复数的实数和虚数部分,i 为复数单位。

TIP

对于一个复数 z := complex(x, y),可以通过内置函数 real(z) 来获得该复数的实部,也就是 x; 通过 imag(z) 获得该复数的虚部,也就是 y。 复数也可以使用 ==!= 来进行比较,只有当实数和虚数都一致时,才认为两个复数相等,操作复数优先选择 complex128, 因为内置的 mathcmplx 包提供的函数使用的类型都是该类型。

类型范围声明方式
complex6432 位实数和虚数var name complex64 = complex(x, y)
complex12864 位实数和虚数var name complex128 = complex(x, y)

Released under the MIT License.