Go 语言入门指南:基础语法和常用特性解析|青训营 - (2)

44 阅读4分钟

结构体与方法

在 Go 语言中,结构体是一种自定义的数据类型,用于组织和存储一组相关的数据字段。结构体可以包含任意数量的字段,并且每个字段都可以是不同的数据类型。

下面是一个示例的结构体定义:

type Person struct {
    Name string
    Age  int
}

在上面的例子中,我们定义了一个名为 Person 的结构体,它有两个字段:Name 和 Age,分别表示人的姓名和年龄。

接下来,我们可以为结构体定义方法。方法是与特定类型关联的函数,可以在该类型的实例上进行操作。在 Go 语言中,我们使用接收者来定义方法,接收者是一个参数,它可以是任何类型,通常是结构体类型。

下面是一个示例的结构体方法定义:

func (p Person) SayHello() {
    fmt.Println("Hello, my name is", p.Name)
}

在上面的例子中,我们为 Person 结构体定义了一个名为 SayHello 的方法。该方法接收一个 Person 类型的接收者 p,并打印出该人的姓名。

接下来,我们可以创建一个 Person 类型的实例,并调用该方法:

func main() {
    p := Person{
        Name: "Alice",
        Age:  25,
    }

    p.SayHello()
}

以上代码将输出:Hello, my name is Alice

通过结构体和方法的组合,我们可以更好地组织和操作数据。您可以根据自己的需求定义结构体和方法,并在程序中使用它们。

数组和切片

在 Go 语言中,数组和切片都是用来存储一系列相同类型的元素的数据结构。它们的主要区别在于大小固定与大小可变。

  1. 数组(Array):

    • 数组是一个固定大小的数据结构,一旦声明,大小就不能改变。
    • 声明数组的语法为 var name [size]type,例如 var arr [5]int
    • 数组的索引从0开始,通过索引可以访问和修改数组中的元素。
    • 数组可以使用循环或索引进行遍历。
  2. 切片(Slice):

    • 切片是一个动态大小的数据结构,可以根据需要进行扩展或缩小。
    • 声明切片的语法为 var name []type,例如 var slice []int
    • 切片底层引用一个数组,但切片本身拥有长度和容量属性。
    • 可以使用内置函数 make 创建切片,并指定切片的长度和容量。
    • 切片可以通过 append 函数添加元素,自动扩容。
    • 切片可以使用索引或切片表达式进行遍历。

示例代码:

package main

import "fmt"

func main() {
   // 声明数组
   var arr [5]int

   // 初始化数组
   for i := 0; i < len(arr); i++ {
      arr[i] = i + 1
   }

   // 打印数组
   fmt.Println("Array:", arr)

   // 声明切片
   var slice []int

   // 使用切片表达式创建切片
   slice = arr[1:4]

   // 打印切片
   fmt.Println("Slice:", slice)

   // 修改切片元素
   slice[0] = 10

   // 打印修改后的数组和切片
   fmt.Println("Array after modification:", arr)
   fmt.Println("Slice after modification:", slice)

   // 使用 append 添加元素到切片
   slice = append(slice, 20)

   // 打印添加元素后的切片
   fmt.Println("Slice after appending element:", slice)
}

输出结果:

Array: [1 2 3 4 5]
Slice: [2 3 4]
Array after modification: [1 10 3 4 5]
Slice after modification: [10 3 4]
Slice after appending element: [10 3 4 20]

通过以上示例,可以看到数组的大小固定,而切片的大小可以根据需要动态变化。切片比数组更常用,因为它更灵活,可以动态地处理数据集合。

映射

在Go语言中,映射(map)是一种用于存储键值对的集合数据结构。映射使用哈希表来实现,可以高效地进行键的查找和插入操作。

在Go语言中,可以使用make函数来创建一个映射。下面是一个创建和使用映射的示例:

// 创建一个空的映射
m := make(map[string]int)

// 向映射中插入键值对
m["apple"] = 1
m["banana"] = 2
m["orange"] = 3

// 获取映射中的值
fmt.Println(m["apple"])   // 输出:1

// 判断键是否存在
value, ok := m["banana"]
if ok {
    fmt.Println(value)    // 输出:2
}

// 删除映射中的键值对
delete(m, "orange")

映射的键可以是任意可比较类型的值,例如整数、浮点数、字符串、结构体等。值可以是任意类型的值,包括基本类型、复合类型、函数、接口等。

映射是无序的,即键值对的顺序不确定。如果需要按照特定的顺序访问映射中的键值对,可以先将键存储在切片中,并对切片进行排序。

注意:映射是引用类型,在函数间传递映射时,实际上传递的是映射的指针,因此对映射的修改会影响原始映射的内容。如果需要传递映射的副本,可以使用copy函数创建一个新的映射。