Golang 结构体
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
上面的代码创建了一个地址类型的变量,默认设置为零。对于一个结构,零意味着所有的字段都被设置为相应的零值。因此,姓名、街道、城市、州等字段被设置为””,而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来代替显式的dereference (*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