Golang 中的结构是最常用的结构之一,也是创建用户定义类型的一种方式。
在本文中,我将通过几个示例涵盖有关结构的所有基础知识以及如何在您的 go 程序中使用它们。
让我们开始吧!
介绍
一个 结构 是多个数据字段的集合,它们定义的数据类型组合在一起。 它们对于将数据分组在一起以形成自定义记录很有用。 结构由内置类型和用户定义类型组成(结构本身是用户定义类型)。
Golang 中的结构是可变的,即它们可以在整个程序中修改。
结构允许我们跨多个模块创建和传递复杂的数据结构,从而有助于提高整体代码质量。 想象一下将 10 个参数传递给一个函数,您很快就会摆脱代码。 这正是结构有用的原因,现在您只需将一个结构传递给该函数,而不是 10 个参数。
使用两个关键字声明结构 – 类型 和结构。 它用大括号括起来(就像 java 中的类)——它包含一组具有定义类型和标识符(名称)的字段。 我们将在下一节讨论实现细节。
如果您有面向对象编程 (OOP) 的背景,您可以将 struct 视为一个没有继承的类。
声明结构
现在,您了解了结构是什么以及为什么使用它,是时候学习如何声明结构了。 结构的基本骨架看起来像——
type name_of_struct struct { field1 data_type_field1 field2 data_type_field2 }
在这里,type 和 struct 是关键字,而 struct 包含多个字段及其定义的数据类型。
让我们看一个例子——
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 } func main() { var user User fmt.Println(user) }
在这里,我们定义了一个 User 结构,它由 string、int 和 float32 字段组成。 在 main() 中,我们将我们的结构声明为用户并打印它! 我们得到的输出是结构的零/空值,因为我们还没有初始化它! 这 零值 基本上是每个字段的零值。
{ 0 0}
初始化结构
在上一节中,我们学习了如何声明结构。 现在,我们想要对它们进行初始化或赋值。 检查下面的代码,了解我们如何做到这一点 –
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 } func main() { // With field names user1 := User{ name: "Mohit", age: 24, bankBalance: 100.0, } // Without field names user2 := User{"Nidhi", 21, 1000.0} fmt.Println(user1) fmt.Println(user2) }
代码本身解释了我们如何使用和不使用字段名称来初始化两个结构。 在这里,输出将是 –
{Mohit 24 100} {Nidhi 21 1000}
在上述情况下,如果其中一个字段未初始化,则该字段默认为其零值。
user1 := User{ name: "Mohit", age: 24, } // Output - { Mohit 24 0.0 }
还有一种使用 new 关键字创建结构的方法。 我们将在下一节中介绍如何使用它。
访问结构的字段
现在我们知道如何创建和初始化结构,让我们看看如何访问结构的字段。 为此,Golang 为我们提供了点运算符。 继续前面的示例,让我们访问姓名和年龄字段并打印它们。
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 } func main() { // With field names user := User{ name: "Mohit", age: 24, bankBalance: 100.0, } fmt.Println(user.name) fmt.Println(user.age) fmt.Println(user.bankBalance) }
在这里,我们使用 struct_name.field_name 来访问结构中的字段。 上面代码的输出将是——
Mohit 24 100
如前所述,我们可以使用 new 关键字创建结构。 让我们看看如何 –
user := new(User) user.name = "Mohit" user.age = 24 user.bankBalance = 100.0 fmt.Println(user) // Output - &{Mohit 24 100}
new 关键字返回指向已初始化结构的指针。 在 Golang 中,您不需要显式取消引用指针,但 fmt.Println(*user) 会产生相同的输出。
嵌套结构
golang 中的结构也可以包含其他用户定义的类型。 因此,一个结构可以包含其他嵌套结构。
package main import ( "fmt" ) type User struct { name string age int bankBalance float32 roleDetails RoleDetails } type RoleDetails struct { position string team string } func main() { roleDetailForMohit := RoleDetails{ position: "Software Engineer", team: "Transport", } user := User{ name: "Mohit", age: 24, bankBalance: 100.0, roleDetails: roleDetailForMohit, } fmt.Println(user) }
在上面的代码中,我们将 RoleDetails 结构作为 User 结构的一部分。 输出将是 –
{Mohit 24 100 {Software Engineer Transport}}
如果你想访问 roleDetails,你可以使用相同的点运算符来实现——
用户.roleDetails.position
结构平等
如果两个结构的每个字段都相等(内置的和用户定义的)但并非所有数据类型都是可比较的,则两个结构是相等的。 (地图不能直接比较)。 让我们看一个例子来证明平等。
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{ name: "Mohit", age: 24, bankBalance: 100.0, } user3 := User{ name: "Nidhi", age: 21, bankBalance: 1000.0, } if user1 == user2 { fmt.Println("user1 and user2 are equal") } else { fmt.Println("user1 and user2 are not equal") } if user1 == user3 { fmt.Println("user1 and user3 are equal") } else { fmt.Println("user1 and user3 are not equal") } }
空值结构和零值结构是相等的。 字段的顺序无关紧要,基本上,每个字段都应该匹配以确保相等。 上面代码的输出将是 –
user1 and user2 are equal user1 and user3 are not equal
结论
惊人的!
现在您可以在 golang 中使用结构体了。 我们涵盖了所有基础知识,如声明、初始化和访问结构字段。 我们还研究了如何比较两个结构,甚至实现了一个嵌套结构。 这里有一些资源来了解更多关于结构的信息——
关于结构还有很多东西需要学习,但现在这是一个好的开始。 我希望你学到了新东西!
继续探索。 保持学习!