Golang中的结构(struct)是一种用户定义的类型,允许将可能不同类型的项分组/组合成单个类型。任何现实世界中拥有一组属性/字段的实体都可以表示为结构。这个概念通常与面向对象编程中的类进行比较。它可以被称为不支持继承但支持组合的轻量级类。
例如,一个地址具有name,street,city,state,Pincode。如下所示,将这三个属性组合为一个结构Address是有意义的。
声明结构:
type Address struct {
name string
street string
city string
state string
Pincode int
}
在上面,type关键字引入了一个新类型。其后是类型的名称(Address)和关键字struct,以说明我们正在定义结构。该结构包含花括号内各个字段的列表。每个字段都有一个名称和类型。
注意:我们还可以通过组合相同类型的各个字段来使它们紧凑,如下例所示:
type Address struct {
name, street, city, state string
Pincode int
}
定义结构:声明结构的语法:
var a Address
上面的代码创建一个Address类型的变量,默认情况下将其设置为零。对于结构,零表示所有字段均设置为其对应的零值。因此,字段name,street,city,state都设置为“”,而Pincode设置为0。
您还可以使用结构字面量来初始化结构类型的变量,如下所示:
var a = Address{"Akshay", "PremNagar", "Dehradun", "Uttarakhand", 252636}
注意:
始终以在结构中声明它们的顺序传递字段值。同样,您不能仅使用上述语法初始化字段的子集。
Go还支持名称:value语法,用于初始化结构(使用此语法时字段的顺序无关紧要)。而且,这仅允许您初始化字段的子集。所有未初始化的字段均设置为其相应的零值。
例如:
var a = Address{"Akshay", "PremNagar", "Dehradun", "Uttarakhand", 252636}
package main
import "fmt"
//定义结构类型
type Address struct {
Name string
city string
Pincode int
}
func main() {
//声明一个“struct”类型的变量
//初始化所有struct字段
//其值为零
var a Address
fmt.Println(a)
//声明和初始化
// struct使用结构文字
a1 := Address{"Akshay", "Dehradun", 3623572}
fmt.Println("Address1: ", a1)
//在命名字段时
//初始化一个结构
a2 := Address{Name: "Anikaa", city: "Ballia",Pincode: 277001}
fmt.Println("Address2: ", a2)
//未初始化的字段设置为
//它们对应的零值
a3 := Address{Name: "Delhi"}
fmt.Println("Address3: ", a3)
}
输出:
{ 0}
Address1: {Akshay Dehradun 3623572}
Address2: {Anikaa Ballia 277001}
Address3: {Delhi 0}
要访问结构的各个字段,您必须使用点(.)运算符。
package main
import "fmt"
//定义结构体
type Car struct {
Name, Model, Color string
WeightInKg float64
}
func main() {
c := Car{Name: "Ferrari", Model: "GTC4", Color: "Red", WeightInKg: 1920}
//访问结构字段
//使用点运算符
fmt.Println("Car Name: ", c.Name)
fmt.Println("Car Color: ", c.Color)
//赋新值
//指向一个结构字段
c.Color = "Black"
//显示结果
fmt.Println("Car: ", c)
}
输出:
Car Name: Ferrari
Car Color: Red
Car: {Ferrari GTC4 Black 1920}
Golang中的指针是一个变量,用于存储另一个变量的内存地址。您还可以创建一个指向结构的指针,如以下示例所示:
// 指向结构体的指针
package main
import "fmt"
// 定义一个结构
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
//传递struct变量的地址
// emp8是指向Employee结构的指针
emp8 := &Employee{"Sam", "Anderson", 55, 6000}
//(* emp8).firstName是要访问的语法
// emp8结构的firstName字段
fmt.Println("First Name:", (*emp8).firstName)
fmt.Println("Age:", (*emp8).age)
}
输出:
First Name: Sam
Age: 55
Golang为我们提供了使用emp8.firstName而不是显式解引用(* emp8).firstName来访问firstName字段的选项。 显示此示例如下:
//指向结构的指针
package main
import "fmt"
//定义一个结构
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
//获取指向结构体的指针
emp8 := &Employee{"Sam", "Anderson", 55, 6000}
// emp8.firstName用于访问
//字段firstName
fmt.Println("First Name: ", emp8.firstName)
fmt.Println("Age: ", emp8.age)
}
输出:
First Name: Sam
Age: 55