Golang宝藏语言工具箱第四天打卡:环环相扣,Go语言结构体,指针和切片初认识
2023-09-22 16:27:55
- 引言
学编程犹如探险,知识点彼此交织,新手很容易因为知识理解不透彻而迷失方向。本篇文章将继续我们对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程序员,那么你必须掌握这些概念。