go语言提供了丰富的数据类型。
1. 基本数据类型
- 布尔类型(
bool
):- 表示一个布尔值,取值为
true
或false
。 - 用于逻辑判断。
- 示例:
var isDone bool = true
- 表示一个布尔值,取值为
- 数字类型:
- 整数类型:
- 有符号整数:int、
int8
(8 位)、int16
(16 位)、int32
(32 位)、int64等
- 无符号整数:
uint8
(8 位,也称为byte
,常用于处理字节数据)、uint16
(16 位)、uint32
(32 位)、uint64
(64 位),以及与平台相关的uint
。 - 这这里我建议如果知道长度范围,尽量使用带长度的类型,有利于跨平台使用
- 示例:
var num1 int32 = 100 var num2 uint8 = 255
- 有符号整数:int、
- 浮点类型:
float32
(32 位)和float64
(64 位)。float64
精度更高,是 Go 语言中浮点运算的默认类型。 - 示例:
var pi float64 = 3.14159
- 复数类型:
complex64
(实部和虚部为float32
)和complex128
(实部和虚部为float64
)。 - 示例:
var c1 complex64 = 1 + 2i var c2 complex128 = complex(3, 4)
- 整数类型:
- 字符串类型(
string
):- 表示一个不可变的字节序列,通常用于存储文本。字符串使用双引号
"
或反引号 ` 定义。双引号内的字符串支持转义字符,反引号内的字符串为原生字符串,不支持转义。 - 示例:
var str1 string = "Hello, World!" var str2 string = `This is a raw string\n with no escape`
- 表示一个不可变的字节序列,通常用于存储文本。字符串使用双引号
2. 复合数据类型
- 数组(
array
):- 具有固定长度且元素类型相同的数据结构。数组长度在声明时就确定,不能动态改变。
- 示例:
var arr [5]int = [5]int{1, 2, 3, 4, 5} // 或简写为 arr2 := [3]string{"a", "b", "c"}
- 切片(
slice
):- 是对数组的一个连续片段的引用,长度可以动态变化。切片是 Go 语言中常用的数据结构,相比数组更灵活。
- 示例:
s := []int{1, 2, 3} // 通过make函数创建切片 s2 := make([]string, 0, 5)
- 映射(
map
):- 一种无序的键值对集合,类似于其他语言中的字典或哈希表。键必须是可比较的类型(如基本类型、指针、接口等),值可以是任意类型。
- 示例:
m := map[string]int{"one": 1, "two": 2} // 通过make函数创建map m2 := make(map[string]bool)
- 结构体(
struct
):- 一种用户自定义的数据类型,用于将不同类型的数据组合在一起。结构体可以包含多个字段,每个字段有自己的名称和类型。
- 示例:
type Person struct { Name string Age int } p := Person{"John", 30}
3. 引用类型
- 指针(
pointer
):- 指针类型的值是一个变量的内存地址。通过指针,程序可以直接访问和修改变量在内存中的值。
- 示例:
var num int = 10 var ptr *int = &num
- 接口(
interface
):- 定义了一组方法签名,但不包含方法的实现。接口类型的变量可以存储任何实现了这些方法的类型的值,实现了多态性。
- 空接口的使用(非常重要):
- 作为入参可以作为占位符,替代任意一种数据类型
- 作为变参使用的时候,也是如此,可以看看 fmt.Printf族函数,应该有类似的使用
- 示例:
type Animal interface { Speak() string } type Dog struct{} func (d Dog) Speak() string { return "Woof" } var a Animal = Dog{}
4. 其他类型
- 常量(
constant
):- 约定常量的名字使用全大写
- 常量的值不可以被修改
// 1. 显示定义
const PIE float64 = 3.14
// 2. 类型推断
const (
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
Sunday = 7
)
// 3. 相邻行如果未赋值,则与上一行的值一样
const (
a = 100
b
c = "hehe"
d
)
- 枚举(enum):
- 就是一种特殊的常量类型
- 补充一个iota的用法:从iota出现的位置自增长,默认从0开始
const (
e = iota
f
g
h
i = "hhhh"
j
k = iota
l
)
func main() {
fmt.Println(e, f, g, h)
fmt.Println(i, j, k, l)
}
// 输出结果:
// 0 1 2 3
// hhhh hhhh 6 7
- 通道(
channel
):- 用于在不同的 Go 协程(goroutine)之间进行通信和同步。通道可以传递数据,并且可以是带缓冲的或无缓冲的。
- 通道的类型可以有三种:读写,只读,只写。
- 只读和只写类型仅仅应用于入参,创建一个只读,只写,没有实际意义。
c1 := make(chan int) // 读写通道
c2 := make(<- chan int) // 只写通道 示例,不要这么用
c3 := make(chan <- int) // 制度通道 示例,不要这么用