Golang中的结构体

Golang中的结构体是最常用的一种,也是创建用户定义类型的一种方式。

在本篇文章中,我将介绍有关结构体的所有基础知识以及如何在您的go程序中使用它们,并提供一些示例。

让我们开始吧!

介绍

一个结构体是多个数据字段及其定义的数据类型组合在一起的集合。它们有助于将数据组合在一起形成自定义记录。结构体由内置类型用户定义类型(结构体本身是用户定义的类型)组成。

Golang中的结构体是可变的,即它们可以在整个程序中被修改。

结构体有助于提高代码质量,允许我们在多个模块之间创建和传递复杂的数据结构。想象一下把10个参数传递给一个函数,您很快就会对代码失去兴趣。这正是结构体有用的地方,现在您只需将一个结构体作为参数传递给该函数,而不是10个参数。

结构体使用两个关键字 – typestruct进行声明。它用大括号括起来(就像java中的类一样) – 其中包含一组具有已定义类型和标识符(名称)的字段。我们将在下一节中讨论实现细节。

如果您来自面向对象编程(OOP)的背景,可以将结构体视为一个没有继承的类。

声明结构体

现在,您了解了什么是结构体以及为什么使用它,是时候学习如何声明结构体了。结构体的基本框架如下 –

type 结构体名称 struct { 
     字段1 字段1的数据类型 
     字段2 字段2的数据类型 
 }

在这里,typestruct是关键字,而结构体包含多个具有其定义数据类型的字段。

让我们看一个例子 –

package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	var user User
	fmt.Println(user)
}

在这里,我们定义了一个User结构体,它包含了stringintfloat32字段。在main()中,我们将结构体声明为user并打印它!我们得到的输出是结构体的零值/空值,因为我们还没有对其进行初始化!zero value基本上是每个字段的零值。

{ 0 0}

初始化结构体

在上一节中,我们学习了如何声明结构体。现在,我们希望初始化或赋予它们值。请查看下面的代码,了解我们如何做到这一点 –

package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	// 使用字段名称
	user1 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	
	// 不使用字段名称
	user2 := User{"Nidhi", 21, 1000.0}
	
	fmt.Println(user1)
	fmt.Println(user2)
}

代码本身解释了如何使用和不使用字段名称初始化两个结构体。在这里,输出将是 –

{Mohit 24 100}
 {Nidhi 21 1000}

在上述情况下,如果一个字段没有初始化,则该字段默认为其零值。

user1 := User{
	name:        "Mohit",
	age:         24,
}

 // 输出 - { Mohit 24 0.0 }

还有一种使用new关键字创建结构体的方法。我们将在下一节中看到如何使用它。

访问结构体的字段

现在我们知道如何创建和初始化结构体,让我们看看如何访问结构体的字段。为此,Golang为我们提供了点运算符。继续使用前面的例子,让我们访问name和age字段并打印它们。

包的名称为main

导入fmt
类型为User的结构体
name为字符串
age为整数
bankBalance为浮点数

main函数
创建一个名为user的User结构体变量
name为”Mohit”
age为24
bankBalance为100.0

打印user的name字段
打印user的age字段
打印user的bankBalance字段

这里,我们使用结构体中的struct_name.field_name来访问结构体中的字段。以上代码的输出将是:

Mohit
24
100

如前所述,我们可以使用new关键字创建结构体。让我们看看如何做到这一点:

创建名为user的User结构体指针
user的name为”Mohit”
user的age为24
user的bankBalance为100.0

打印user

输出:&{Mohit 24 100}

new关键字返回初始化结构体的指针。在Golang中,您不需要显式解引用指针,但是fmt.Println(*user)将得到相同的输出。

嵌套结构体

Golang中的结构体可以包含其他用户定义的类型。因此,一个结构体可以包含其他嵌套的结构体。

导入fmt
类型为User的结构体
name为字符串
age为整数
bankBalance为浮点数
roleDetails为RoleDetails类型的字段

类型为RoleDetails的结构体
position为字符串
team为字符串

main函数
为Mohit创建一个名为roleDetail的RoleDetails结构体
position为”Software Engineer”
team为”Transport”
为user创建一个名为user的User结构体
name为”Mohit”
age为24
bankBalance为100.0
roleDetails为roleDetail

打印user

以上代码中,我们在User结构体中使用RoleDetails结构体。输出将是:

{Mohit 24 100 {Software Engineer Transport}}

如果要访问roleDetails,可以使用相同的点运算符进行访问:

user.roleDetails.position

结构体相等性

如果每个字段相等(内置和用户定义的类型),则两个结构体相等,但并非所有数据类型都可以进行比较(映射不能直接比较)。让我们看一个示例来说明相等性。

导入fmt
类型为User的结构体
name为字符串
age为整数
bankBalance为浮点数

main函数
为Mohit创建一个名为user1的User结构体
name为”Mohit”
age为24
bankBalance为100.0
为Mohit创建一个名为user2的User结构体
name为”Mohit”
age为24
bankBalance为100.0
为Nidhi创建一个名为user3的User结构体
name为”Nidhi”
age为21
bankBalance为1000.0

如果user1等于user2,则打印”user1 and user2 are equal”,否则打印”user1 and user2 are not equal”
如果user1等于user3,则打印”user1 and user3 are equal”,否则打印”user1 and user3 are not equal”

空和零值结构体是相等的。字段的顺序无关紧要,基本上,每个字段应相等。以上代码的输出将是:

user1 and user2 are equal
user1 and user3 are not equal

结论

太棒了!
现在你已经准备好在Golang中使用结构体了。我们涵盖了声明、初始化和访问结构体字段的所有基础知识。我们还看了如何比较两个结构体,甚至实现了一个嵌套结构体。以下是一些了解更多关于结构体的资源:

链接3
链接4
链接5

关于结构体还有很多要学习的,但现在这是一个很好的开始。希望你学到了一些新知识!

继续探索。不断学习!

类似文章