布尔型
布尔型的关键字是bool
,只有两个值true
和false
,true
和false
是Go内置的两个预声明标识符。
// 声明bool型变量
var ok bool
ok = true
// 布尔型和整型数据不能相互比较
var a int = 1
var b bool = true
a == b // ❌ 不能进行比较
// 比较表达式和逻辑表达式的结果都是布尔型数据
var b bool = (x > y) && (x > 0)
// 声明布尔型变量如果不指定初始值,则默认为false
var b bool // b == false
整型
Go语言中内置了12中整型类型,分别是:byte
、int
、int8
、int16
、int32
、int64
、uint
、uint8
、uint16
、uint32
、uint64
、uintptr
。其中byte
是uint8
的别名,不同类型的整型必须进行强制类型转换。
// 有符号整型
int8 // -128~127
int16 // -32768~32767
int32 // -2147483648~2147483647
int64 // -9223372036854775808~9223372036854775807
// 无符号整型
uint8 // 0~255
uint16 // 0~65535
uint32 // 0~4294967295
uint64 // 0~18446744073709551615
// 取决于系统位数
int
uint
// 特殊类型
uintptr // 无符号整型,由系统决定占用位大小,足够存放指针即可,和C库或者系统接口交互
var a int = 1
var b int32 = 2
b = a // 不同类型的整型必须进行强制转换
// 整型支持算术运算和位操作
var a int = (1 + 2) * 3
var b int = 1000>>2
浮点型
Go语言中设置两个浮点数类型,分别是float32
和float64
- 浮点型字面量被自动类型推断为
float64
- 计算机很难进行浮点数的精确表示和比较,因此两个浮点数之间不应该使用
==
或!=
进行比较操作。 - 浮点型数据在内存中的分配
var b := 10.00 // float64 10.00
复数类型
Go语言内置的复数烈性有两种,分别是complex64
和 complex128
,复数在计算机里面使用2个浮点数表示,一个表示实部一个表示虚部。
var value complex128 = 3.1 + 5i
value1 != 3.2 + 6i
// Go有三个内置函数处理复数
var v = complex(1.2, 3) // 构造一个复数
a := real(v) // 返回复数实部
b := imag(v) // 返回复数虚部
字符串
- 字符串是常量,可以通过类似数组的索引访问其字节单元,但是不能修改某个字节的值
- 字符串转换为切片
[]byte
要慎重,尤其是当数据量较大时(每次转换都需赋值内容) - 字符串尾部不包含
NULL
,这一点和C/C++不一样 - 字符串类型底层实现是一个二元的数据结构,一个是指针指向字节数组的起点,另一个是长度
- 基于字符串创建的切换和原字符串指向相同的底层字符数组,一样不能修改,对字符串的切片操作返回的子串仍然是
string
,而非slice
- 字符串和切片的转换:字符串可以转换为字节数组,也可以转换为
Unicode
的字数组 ```go // 定义一个字符串 var a = “hello world”
b := a[0] // 通过索引访问字节单元 a[1] = “m” // ❌ 不能修改某个字节的值
s := []byte(a) // 字符串转换为字节数组
// 字符串的slice操作 c := a[0, 4] d := a[1:] e := a[:4]
// 字符串拼接 f := d + e; len(f) // 使用len函数计算字符串长度
g := “hello, 世界” for i :=0;i<len(g);i++ { // 遍历字节数组 fmt.Println(d[i]) }
for i, v := range g { // 遍历rune数组 fmt.Println(i, v) } ```