Golang 中的结构体或结构体是用户定义的类型,它允许将可能不同类型的项目分组/组合成单个类型。任何具有某些属性/字段集的现实世界实体都可以表示为一个结构体。这个概念通常与面向对象编程中的类进行比较。它可以称为不支持继承但支持组合的轻量级类。
例如,地址具有名称、街道、城市、州、Pincode。将这三个属性分组到一个结构地址中是有意义的,如下所示。
声明一个结构:
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 类型的变量,该变量默认设置为零。对于结构体,零意味着所有字段都设置为其相应的零值。所以字段名称,街道,城市,州设置为“”,Pincode设置为0。
您还可以使用结构体字面量量初始化结构体类型的变量,如下所示:
var a = Address{"Akshay", "PremNagar", "Dehradun", "Uttarakhand", 252636}
笔记:
- 始终按照它们在结构中声明的相同顺序传递字段值。此外,您不能仅使用上述语法初始化字段的子集。
- Go 还支持name: value用于初始化结构的语法(使用此语法时字段的顺序无关紧要)。这允许您仅初始化字段的子集。所有未初始化的字段都设置为其相应的零值。
例子:
var a = Address{Name:”Akshay”, street:”PremNagar”, state:”Uttarakhand”, Pincode:252636} //city:””
// Golang program to show how to
// declare and define the struct
package main
import "fmt"
// Defining a struct type
type Address struct {
Name string
city string
Pincode int
}
func main() {
// Declaring a variable of a `struct` type
// All the struct fields are initialized
// with their zero value
var a Address
fmt.Println(a)
// Declaring and initializing a
// struct using a struct literal
a1 := Address{"Akshay", "Dehradun", 3623572}
fmt.Println("Address1: ", a1)
// Naming fields while
// initializing a struct
a2 := Address{Name: "Anikaa", city: "Ballia",
Pincode: 277001}
fmt.Println("Address2: ", a2)
// Uninitialized fields are set to
// their corresponding zero-value
a3 := Address{Name: "Delhi"}
fmt.Println("Address3: ", a3)
}
输出:
{ 0}
Address1: {Akshay Dehradun 3623572}
Address2: {Anikaa Ballia 277001}
Address3: {Delhi 0}
如何访问结构的字段?
要访问结构的各个字段,您必须使用点(.)运算符。
例子:
// Golang program to show how to
// access the fields of struct
package main
import "fmt"
// defining the struct
type Car struct {
Name, Model, Color string
WeightInKg float64
}
// Main Function
func main() {
c := Car{Name: "Ferrari", Model: "GTC4",
Color: "Red", WeightInKg: 1920}
// Accessing struct fields
// using the dot operator
fmt.Println("Car Name: ", c.Name)
fmt.Println("Car Color: ", c.Color)
// Assigning a new value
// to a struct field
c.Color = "Black"
// Displaying the result
fmt.Println("Car: ", c)
}
输出:
Car Name: Ferrari
Car Color: Red
Car: {Ferrari GTC4 Black 1920}
指向结构体的指针
Go 编程语言或 Golang 中的指针是一个变量,用于存储另一个变量的内存地址。您还可以创建指向结构的指针,如下例所示:
// Golang program to illustrate
// the pointer to struct
package main
import "fmt"
// defining a structure
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
// passing the address of struct variable
// emp8 is a pointer to the Employee struct
emp8 := &Employee{"Sam", "Anderson", 55, 6000}
// (*emp8).firstName is the syntax to access
// the firstName field of the emp8 struct
fmt.Println("First Name:", (*emp8).firstName)
fmt.Println("Age:", (*emp8).age)
}
输出:
First Name: Sam
Age: 55
Golang为我们提供了使用emp8.firstName而不是显式取消引用(*emp8).firstName来访问firstName字段的选项。显示这一点的示例如下:
// Golang program to illustrate
// the pointer to struct
package main
import "fmt"
// Defining a structure
type Employee struct {
firstName, lastName string
age, salary int
}
// Main Function
func main() {
// taking pointer to struct
emp8 := &Employee{"Sam", "Anderson", 55, 6000}
// emp8.firstName is used to access
// the field firstName
fmt.Println("First Name: ", emp8.firstName)
fmt.Println("Age: ", emp8.age)
}
输出:
First Name: Sam
Age: 55