📜  Golang 中的结构

📅  最后修改于: 2021-10-24 13:02:55             🧑  作者: Mango

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用于初始化结构的语法(使用此语法时字段的顺序无关紧要)。这允许您仅初始化字段的子集。所有未初始化的字段都设置为其相应的零值。

    例子:

// 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