Golang菜鸟入门:数据类型和表达式
谈到Go的数据类型和表达式时,需要掌握以下这些知识:
bool、string、int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64、uintptr、byte、rune、float32和float64。其中byte是uint8的别名,rune是int32的别名。下面是关于Go基本数据类型的总结:
| 类型名称 | 类型描述 | 大小(字节) | 默认值 | 范围 |
|---|---|---|---|---|
| bool | 布尔类型 | 1 | false | true、false |
| byte | 字节类型 | 1 | 0 | 0~255 |
| rune | Unicode字符类型 | 4 | 0 | -2147483648~2147483647 |
| int | 整数类型 | 平台相关 | 0 | 最大值和最小值取决于平台,通常为-2147483648~2147483647 |
| int8 | 8位整数类型 | 1 | 0 | -128~127 |
| int16 | 16位整数类型 | 2 | 0 | -32768~32767 |
| int32 | 32位整数类型 | 4 | 0 | -2147483648~2147483647 |
| int64 | 64位整数类型 | 8 | 0 | -9223372036854775808~9223372036854775807 |
| uint | 无符号整数类型 | 平台相关 | 0 | 最大值取决于平台,通常为0~4294967295 |
| uint8 | 8位无符号整数类型 | 1 | 0 | 0~255 |
| uint16 | 16位无符号整数类型 | 2 | 0 | 0~65535 |
| uint32 | 32位无符号整数类型 | 4 | 0 | 0~4294967295 |
| uint64 | 64位无符号整数类型 | 8 | 0 | 0~18446744073709551615 |
| uintptr | 指针类型 | 平台相关 | 0 | 保存指针地址的整数值 |
需要注意的是,Go语言中支持隐式类型转换,但是不同类型之间的转换需要满足特定的规则。另外,Go还提供了一种复合类型complex,用于表示复数。complex由实部和虚部两个float32或float64类型组成,可以用于数学运算。
| 类型名称 | 类型描述 | 大小(字节) | 初始化方式 |
|---|---|---|---|
| 数组(Array) | 在内存中连续存储多个同类型元素的集合,长度固定不变 | n * 元素大小 | var a [n]T、a := [n]T{value1, value2, ..., valuen}、a := [...]T{value1, value2, ..., valuen} |
| 切片(Slice) | 动态数组,由指向底层数组的指针、长度和容量三部分组成 | 24 | var s []T = make([]T, len, cap)、s := []T{value1, value2, ..., valuen}、s := make([]T, length)、s := make([]T, length, capacity) |
| 映射(Map) | 存储键值对的无序集合,每个键唯一对应一个值 | 平均8字节/条记录 | var m map[T]U = make(map[T]U)、m := map[T]U{key1: value1, key2: value2, ..., keyn: valuen} |
| 通道(Channel) | 用于协程间通信的管道,支持发送和接收数据 | 0或者1 | var ch chan T = make(chan T)、ch := make(chan T, buffer) |
| 结构体 (Struct) | 自定义类型,它由一系列不同类型的字段组成。结构体中的每个字段都有自己的标识符和类型。 | N/A | type person struct { name string age int } var p person p = person{name: "Alice", age: 30} |
需要注意的是,Go 语言中除了数组和结构体外,其他数据类型都是引用类型。这意味着切片、映射等类型在传递给函数或赋值给变量时,实际上是传递了一个指向底层数据结构的指针。因此,在操作这些数据类型时需要小心避免出现副作用。
以下是一些关于Golang复合数据类型数组(Array)的一些例子
var names [3]string
names[0] = "Alice"
names[1] = "Bob"
names[2] = "Charlie"
var flags [4]bool
flags[0] = true
flags[1] = false
flags[2] = false
flags[3] = true
var prices [5]float64
prices[0] = 1.99
prices[1] = 2.99
prices[2] = 3.99
prices[3] = 4.99
prices[4] = 5.99
type Person struct {
Name string
Age int
}
var people [2]Person
people[0] = Person{"Alice", 30}
people[1] = Person{"Bob", 25}
var matrix [3][3]int
matrix[0] = [3]int{1, 2, 3}
matrix[1] = [3]int{4, 5, 6}
matrix[2] = [3]int{7, 8, 9}
以下是一些关于Golang复合数据切片(Slice)类型的一些例子
numbers := []int{1, 2, 3, 4, 5}
以上代码定义了一个名为 numbers 的整数类型切片,其中包含元素 1、2、3、4 和 5。可以通过下标访问切片中的元素。
还可以使用 make 函数来创建指定长度和容量的切片:
numbers := make([]int, 5, 10)
该语句创建了一个长度为 5,容量为 10 的整数类型切片。此时所有元素默认初始化为0。
可以使用 append() 函数将元素添加到切片末尾:
numbers = append(numbers, 6, 7, 8)
此时 numbers 切片的元素变成了 1、2、3、4、5、6、7 和 8。
还可以通过切片操作来获取子切片:
subNumbers := numbers[2:5]
以上代码创建了一个从索引 2 开始,到索引 5 结束(不包括索引 5)的子切片。子切片 subNumbers 包含元素 3、4 和 5。
以下是一些关于Golang复合数据映射(Map)类型的一些例子
ages := map[string]int{
"Alice": 30,
"Bob": 25,
"Charlie": 35,
}
以上代码定义了一个名为 ages 的映射,其中键为字符串类型,值为整数类型。它包含三个条目,分别表示 Alice、Bob 和 Charlie 的年龄。
可以使用索引操作符 [] 获取映射中的值:
fmt.Println(ages["Alice"]) // 输出:30
还可以使用 make() 函数创建空映射:
scores := make(map[string]int)
该语句创建了一个名为 scores 的空映射,键为字符串类型,值为整数类型。
可以使用 delete() 函数从映射中删除条目:
delete(ages, "Bob")
此时映射中不再包含键为 Bob 的条目。
以下是一些关于Golang复合数据通道(Channel)类型的一些例子
package main
import "fmt"
func main() {
// 创建一个整数类型的通道
ch := make(chan int)
// 使用 go 关键字启动一个新的 goroutine
go func() {
// 向通道发送值
ch