返回

Golang宝藏语言工具箱第四天打卡:环环相扣,Go语言结构体,指针和切片初认识

前端

  1. 引言
    学编程犹如探险,知识点彼此交织,新手很容易因为知识理解不透彻而迷失方向。本篇文章将继续我们对Golang语言的探索,但这一次,我们不再只停留于表象。相反,我们将深入挖掘三个看似晦涩难懂的概念:指针、结构体和切片,探索它们之间的联系,并了解如何使用它们来写出更强大、更高效的代码。

1. 指针

从词面意思来看,“指针”似乎与代码之间没有任何关联,但它在Golang中发挥着关键作用。指针本质上是一个变量的地址,用于存储另一个变量的内存地址。这使得指针可以间接访问其他变量,允许我们对变量进行修改,而无需直接对其进行操作。指针通常由一个星号(*)表示,后跟变量的名称。

举个例子,以下代码定义了一个名为“num”的变量,并通过指针“pNum”访问它:

package main

import "fmt"

func main() {
    num := 10
    pNum := &num

    fmt.Println("Value of num:", num)
    fmt.Println("Address of num:", pNum)
    fmt.Println("Value of *pNum:", *pNum)

    *pNum = 20

    fmt.Println("Value of num after modification:", num)
}

当我们运行此代码时,它将输出:

Value of num: 10
Address of num: 0xc0000b8008
Value of *pNum: 10
Value of num after modification: 20

在这个例子中,指针“pNum”指向变量“num”的内存地址。我们可以使用解引用运算符“*”来访问“num”的值。当我们修改“*pNum”的值时,我们实际上是在修改“num”的值。

2. 结构体

结构体是Golang中用于组合相关数据的另一种强大工具。它允许我们创建一个新的数据类型,其中包含多个字段。每个字段可以具有不同的数据类型,并且可以根据需要添加任意数量的字段。结构体通常以“type”定义,后跟结构体的名称和大括号。大括号内包含结构体的字段,每个字段都有一个名称和一个数据类型。

以下代码定义了一个名为“Person”的结构体,其中包含三个字段:“name”、“age”和“address”:

package main

import "fmt"

type Person struct {
    name    string
    age     int
    address string
}

func main() {
    person1 := Person{
        name:    "John Doe",
        age:     25,
        address: "123 Main Street",
    }

    fmt.Println("Name:", person1.name)
    fmt.Println("Age:", person1.age)
    fmt.Println("Address:", person1.address)
}

当我们运行此代码时,它将输出:

Name: John Doe
Age: 25
Address: 123 Main Street

在这个例子中,我们创建了一个“Person”类型的结构体,并使用大括号初始化了它的字段。然后,我们可以通过结构体的字段名称来访问结构体的数据。

3. 切片

切片是Golang中另一种非常有用的数据结构。它本质上是一个数组,但它允许我们动态地调整数组的大小。这意味着我们可以添加或删除元素,而无需重新分配内存。切片通常使用方括号[]定义,后跟切片的元素类型。

以下代码定义了一个名为“numbers”的切片,其中包含三个整数:

package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3}

    fmt.Println("Numbers:", numbers)

    numbers = append(numbers, 4)

    fmt.Println("Numbers after appending:", numbers)

    numbers = numbers[:2]

    fmt.Println("Numbers after slicing:", numbers)
}

当我们运行此代码时,它将输出:

Numbers: [1 2 3]
Numbers after appending: [1 2 3 4]
Numbers after slicing: [1 2]

在这个例子中,我们创建了一个“numbers”切片,并使用大括号初始化了它的元素。然后,我们使用“append()”函数向切片添加了一个新的元素。最后,我们使用切片表达式“numbers[:2]”来创建一个新的切片,其中只包含前两个元素。

4. 指针、结构体和切片之间的联系

指针、结构体和切片是Golang中三个非常重要的概念,它们之间有密切的联系。指针可以用于访问和修改结构体的字段。切片可以存储结构体的指针,从而允许我们对结构体进行动态操作。

例如,以下代码使用指针来修改结构体的字段:

package main

import "fmt"

type Person struct {
    name    string
    age     int
    address string
}

func main() {
    person1 := Person{
        name:    "John Doe",
        age:     25,
        address: "123 Main Street",
    }

    pPerson := &person1

    pPerson.age = 30

    fmt.Println("Age:", person1.age)
}

当我们运行此代码时,它将输出:

Age: 30

在这个例子中,我们使用指针“pPerson”来修改结构体“person1”的“age”字段。

以下代码使用切片来存储结构体的指针:

package main

import "fmt"

type Person struct {
    name    string
    age     int
    address string
}

func main() {
    people := []Person{
        {name: "John Doe", age: 25, address: "123 Main Street"},
        {name: "Jane Doe", age: 30, address: "456 Elm Street"},
    }

    for _, person := range people {
        fmt.Println("Name:", person.name)
        fmt.Println("Age:", person.age)
        fmt.Println("Address:", person.address)
        fmt.Println()
    }
}

当我们运行此代码时,它将输出:

Name: John Doe
Age: 25
Address: 123 Main Street

Name: Jane Doe
Age: 30
Address: 456 Elm Street

在这个例子中,我们创建了一个“people”切片,其中包含两个“Person”结构体的指针。然后,我们使用“range”循环来遍历切片,并访问每个结构体的字段。

5. 结论

指针、结构体和切片都是Golang中非常重要的概念。它们之间的联系非常紧密,可以让我们写出更强大、更高效的代码。如果你想成为一名优秀的Golang程序员,那么你必须掌握这些概念。