Golang 中的结构

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 关键字创建结构的方法。 我们将在下一节中介绍如何使用它。

  14 个适合所有人的最佳 ARK 服务器托管

访问结构的字段

现在我们知道如何创建和初始化结构,让我们看看如何访问结构的字段。 为此,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,你可以使用相同的点运算符来实现——

  9 种教会演示软件,可提供最佳服务

用户.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 中使用结构体了。 我们涵盖了所有基础知识,如声明、初始化和访问结构字段。 我们还研究了如何比较两个结构,甚至实现了一个嵌套结构。 这里有一些资源来了解更多关于结构的信息——

关于结构还有很多东西需要学习,但现在这是一个好的开始。 我希望你学到了新东西!

继续探索。 保持学习!