1.Go的起源
Go语言的起源可以追溯到多个编程语言的影响。它继承了C语言的表达式语法、控制流和高效编译特性,同时融入了Pascal、Modula-2和Oberon的设计理念,如包管理和面向对象特性。Go还借鉴了Tony Hoare的CSP理论,引入了并发模型,特别是通过管道和goroutine实现高效的并发编程。此外,Go还从语言如APL、Scheme等中汲取了灵感,并创新地引入了切片和defer等特性。
2.基础语法
2.1 Go的数据类型
Go语言的数据类型分为四类:
- 基础类型:包括数字类型(整数、浮点数等)、字符串和布尔类型。它们直接表示简单的数值或状态。
- 复合类型:通过组合基础类型来构建更复杂的数据结构,主要包括数组和结构体。
- 引用类型:指向数据的引用,包含指针、切片、字典、函数和通道等类型。对引用类型的数据进行修改会影响所有引用该数据的变量。
- 接口类型:用于表示一组方法的集合,能够实现多态性和动态类型判断,具体内容将在第7章详细介绍。
2.1.1基础数据类型
Go 语言的基础数据类型可以分为以下几类,每类包括不同的类型和用途:
(1). 布尔类型
bool:表示真(true)或假(false)。布尔类型用于控制逻辑流程(如条件判断)。
(2). 数值类型
Go 的数值类型分为整数、浮点数和复数。
-
整数类型
int:平台相关大小,通常为 32 位或 64 位。int8,int16,int32,int64:表示不同字节数的整数类型。uint:无符号整数,平台相关大小。uint8,uint16,uint32,uint64:无符号整数类型,表示不同字节数的无符号整数。byte:uint8的别名,用于表示字节数据。rune:int32的别名,用于表示 Unicode 字符,通常用于字符类型的表示。
-
浮点数类型
float32:表示 32 位浮点数。float64:表示 64 位浮点数,是 Go 默认的浮点数类型。
-
复数类型
complex64:由两个float32组成的复数类型。complex128:由两个float64组成的复数类型。
(3). 字符串类型
string:表示一串字符。字符串是不可变的,Go 中的字符串使用 UTF-8 编码。
(4). 常量
- 常量是编译时决定值的实体,值不可修改。Go 支持多种常量类型,包括布尔常量、整数常量、浮点常量、字符常量、复数常量和字符串常量。常量的声明通过
const关键字完成,且可以使用iota自动生成一组相关常量。
常量可以是基础类型(如 int、float64)或命名类型(如 time.Duration)。常量的运算在编译时完成,这使得它们在运行时更高效。
(5). 类型别名与命名类型
- Go 语言允许通过
type关键字为现有类型创建新的命名类型。命名类型是由基础类型派生而来,可以附加方法,使得代码更具可读性和可维护性。
(6). 无类型常量
- Go 支持无类型常量,这些常量在没有明确指定类型时,可以在更高精度的运算中使用。这种常量在运算时具有更高的精度(至少 256 位),可以被隐式转换为具体类型。无类型常量可以应用于多个不同类型的计算和表达式。
(7). 复合类型
- 数组:一组相同类型的元素,长度固定。
- 切片:一个动态大小的数组,可以增长或缩小。
- 结构体:由多个字段组成的数据结构,每个字段可以有不同的类型。
- 映射(Map) :键值对集合,类似于字典。
- 通道(Channel) :用于 goroutine 之间的通信。
总结
Go 语言的基础数据类型包括:
- 布尔类型
bool - 整数类型(如
int,uint等) - 浮点数类型(如
float32,float64) - 复数类型(如
complex64,complex128) - 字符串类型
string - 常量类型(包括无类型常量)
- 复合数据类型(如数组、切片、结构体、映射、通道等)
2.1.2复合数据类型
Go语言的复合数据类型是用来组织多个数据元素的类型,通常用于表示更复杂的数据结构。它们包括数组、切片、映射(map)、结构体(struct)和指针。以下是对Go语言复合数据类型的总结:
(1). 数组(Array)
- 数组是固定大小的元素集合,所有元素的数据类型必须相同。
- 数组的长度是其类型的一部分,因此数组的类型包含元素的类型和数组的长度。
- 示例:
var arr [5]int,表示一个包含5个整数的数组。
(2). 切片(Slice)
- 切片是数组的一个动态视图,它没有固定大小,可以随着元素的添加而扩展。
- 切片比数组更常用,因为它们具有更灵活的大小,并且在Go中是传递引用的,因此操作切片时不会复制底层数组的数据。
- 切片的基本结构包括:指向底层数组的指针、切片的长度和切片的容量。
- 示例:
s := []int{1, 2, 3},创建了一个包含3个整数的切片。
(3). 映射(Map)
- 映射是一个无序的键值对集合,每个键都有唯一的对应值。
- Go中的映射类似于其他语言中的哈希表或字典。
- 映射是动态的,可以随时添加、删除元素。
- 示例:
m := make(map[string]int),创建一个键为string类型,值为int类型的映射。
(4). 结构体(Struct)
-
结构体是将不同类型的数据组合到一起的复合数据类型,通常用于表示复杂对象。
-
每个结构体包含多个字段,每个字段都有一个名称和一个类型。
-
结构体类型的字段可以是任何数据类型,包括其他结构体。
-
示例:
type Person struct { Name string Age int } var p Person p.Name = "Alice" p.Age = 30
(5). 指针(Pointer)
- 指针是存储另一个变量地址的数据类型,它可以指向任何类型的值。
- Go语言通过指针可以直接修改原始数据,提高性能,避免不必要的复制。
- 指针可以与切片、数组等类型结合使用。
- 示例:
var ptr *int,声明一个指向整数类型的指针。
(6). 接口(Interface)
- 接口是一种抽象类型,它定义了一组方法签名,但不关心这些方法如何实现。
- 实现接口的类型不需要显式声明,而是通过“隐式实现”规则,自动满足接口要求的方法集。
- 接口广泛用于Go的多态机制,允许不同类型通过相同的接口进行操作。
(7). 类型别名和类型声明
- Go支持类型别名(
type关键字)和类型声明,允许为已有的类型定义一个新的名字,或者创建一个新的类型(可能与原类型兼容,但类型不相同)。 - 示例:
type MyInt int,创建了一个新的MyInt类型,它是int类型的别名。
总结:
Go语言的复合数据类型让开发者能够方便地组织和管理复杂数据。数组和切片主要用于有序的数据集合,映射适合用于键值对存储,结构体则用于组织更复杂的对象数据。指针提供了对数据的直接访问,接口则支持灵活的多态机制。掌握这些复合数据类型对于高效编写Go代码至关重要。