Go 语言入门指南—基础语法和常用特性分析 | 豆包MarsCode AI刷题

91 阅读7分钟

1.Go的起源


Go语言的起源可以追溯到多个编程语言的影响。它继承了C语言的表达式语法、控制流和高效编译特性,同时融入了Pascal、Modula-2和Oberon的设计理念,如包管理和面向对象特性。Go还借鉴了Tony Hoare的CSP理论,引入了并发模型,特别是通过管道和goroutine实现高效的并发编程。此外,Go还从语言如APL、Scheme等中汲取了灵感,并创新地引入了切片和defer等特性。

2.基础语法

2.1 Go的数据类型

Go语言的数据类型分为四类:

  1. 基础类型:包括数字类型(整数、浮点数等)、字符串和布尔类型。它们直接表示简单的数值或状态。
  2. 复合类型:通过组合基础类型来构建更复杂的数据结构,主要包括数组和结构体。
  3. 引用类型:指向数据的引用,包含指针、切片、字典、函数和通道等类型。对引用类型的数据进行修改会影响所有引用该数据的变量。
  4. 接口类型:用于表示一组方法的集合,能够实现多态性和动态类型判断,具体内容将在第7章详细介绍。

2.1.1基础数据类型


Go 语言的基础数据类型可以分为以下几类,每类包括不同的类型和用途:

(1). 布尔类型
  • bool:表示真(true)或假(false)。布尔类型用于控制逻辑流程(如条件判断)。
(2). 数值类型

Go 的数值类型分为整数、浮点数和复数。

  • 整数类型

    • int:平台相关大小,通常为 32 位或 64 位。
    • int8, int16, int32, int64:表示不同字节数的整数类型。
    • uint:无符号整数,平台相关大小。
    • uint8, uint16, uint32, uint64:无符号整数类型,表示不同字节数的无符号整数。
    • byteuint8 的别名,用于表示字节数据。
    • runeint32 的别名,用于表示 Unicode 字符,通常用于字符类型的表示。
  • 浮点数类型

    • float32:表示 32 位浮点数。
    • float64:表示 64 位浮点数,是 Go 默认的浮点数类型。
  • 复数类型

    • complex64:由两个 float32 组成的复数类型。
    • complex128:由两个 float64 组成的复数类型。
(3). 字符串类型
  • string:表示一串字符。字符串是不可变的,Go 中的字符串使用 UTF-8 编码。
(4). 常量
  • 常量是编译时决定值的实体,值不可修改。Go 支持多种常量类型,包括布尔常量、整数常量、浮点常量、字符常量、复数常量和字符串常量。常量的声明通过 const 关键字完成,且可以使用 iota 自动生成一组相关常量。

常量可以是基础类型(如 intfloat64)或命名类型(如 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代码至关重要。