Go 结构体


2022年1月7日, 学习 eTutorial
2010

在本教程中,我们将介绍 Go 的 struct 数据类型,它属于复合类型的聚合数据类型。在本教程中,您将了解 Go 中结构体的确切含义、Go 中的定义和声明语法、命名结构体、访问和嵌套结构体数据类型等。

Golang 中的结构体是什么?

结构体是由一组字段组成的结构,每个字段存储不同类型的数据。因此,在 Golang 中,结构体被归类为复合数据类型的聚合类型。结构体中定义的字段具有不同的属性,并且每个属性都具有指定的类型和分配的值。

  •    结构体是复合字段的集合
  •    结构体允许将相关数据分组到一个单元/实体中。
  •    结构体是一个轻量级的类,没有继承。
     

例如:考虑一个组织的员工数据库,它保存所有员工的相关记录,例如员工的姓名、年龄、ID、地点、薪水等。这些是不同的字段,包含各种类型的数据,它们在结构体数据类型下指向单个实体。

PHP : Struct
  •    姓名、年龄、地点、ID、薪水字段是员工详细信息的记录。
  •    年龄、ID 是存储整数类型值的类型
  •    姓名、薪水是存储字符串值的类型。
  •    因此,员工的记录是不同类型实体字段在单个结构下的组合/集合

定义结构体

定义结构体需要两个关键字。它们是

  1.    type:允许创建遵循结构体名称的新类型
  2.    struct:表示新的数据类型
     

type emp_details struct{
Name string
Age int
Place string
Id int
Salary int
}

上面的代码显示了一个名为 emp_details 的结构体,其中包含姓名、年龄、地点、ID 和薪水 字段。上面的结构体定义是一个 命名结构体,因为它创建了一个名为 emp_details 的新结构体数据类型。

  •    type 关键字表示一个新类型,struct 关键字将该类型定义为结构体。 
  •    type 关键字后面跟着结构体的名称(emp_details)。 
  •    结构体在花括号内包含一系列员工的各种字段,如姓名年龄地点薪水ID。 
  •    每个字段都有一个名称和一个类型。 
  •    示例姓名string 类型,薪水int 类型,依此类推。

每个字段写在一行上,可以通过将具有相似数据类型的字段分组到一行上来改变,如下所示


type emp_details struct{
Name Place string  //single line declaration of same type(string)
Age Id Salary Int //single line declaration of same type(integer)
}

如何在 Golang 中初始化结构体 (struct)

在 Go 语言中,结构体通过使用 var 关键字或使用符号“:=”的简短声明来初始化。每当结构体字段未初始化为任何特定值时,它们将被设置为默认类型。

让我们通过示例逐一理解

  1.    使用 var 关键字初始化结构体字段
  2.    使用简短声明初始化结构体字段 
  3.    声明时如果未初始化,则默认类型为零值
     

程序 1. 使用 var 关键字初始化结构体字段


// Golang program to show how to declare and define the struct  
package main  
import "fmt"
  
// Defining a struct type
type emp_details struct {
    Name    string
    Age int
    Place string
    Id int
    salary int
}
  
func main() {
     // Declaring a variable  e  `struct` type using var keyword
     var e emp_details
     fmt.Println(e)
   
    //Declaring and Initializing variable of struct type
    var e1 = emp_details{"miya", 20,"Mumbai",0067,20000}
 fmt.Println(e1)
    
     //Declaring and Initializing variable of struct type
    var e2 = emp_details{Age: 10, salary: 45000} 
 fmt.Println(e2)
}

输出


{ 0  0 0}
{miya 20 Mumbai 55 20000}
{ 10  0 45000}

解释

  •   定义了一个名为 emp_details 的结构体类型。
  •   声明一个变量 e,后面跟着结构体名称
  •   Var e emp_details
    PHP : Struct
  •   创建另一个变量 e1,通过引用结构体名称来分配或初始化结构体字段的值
    PHP : Struct
  •   创建另一个变量 e2,程序员可以根据需要初始化值。在一行中,初始化了特定的选定字段,其余未初始化的字段值将被设置为默认类型。字符串为空格,而整数值在默认类型时为 0。
    PHP : Struct

    程序 2:使用简短声明初始化结构体字段

    
    // Golang program to show how to declare and define the struct  
    package main  
    import "fmt"
      
    // Defining a struct type
    type emp_details struct {
        Name    string
        Age int
        Place string
        Id int
        salary int
    }
      
    func main() {
       
           // Shorthand notation Declaration and Initialization 
        e1 := emp_details{"miya", 20,"Mumbai",0067,20000}
     fmt.Println(e1)
        
         //Shorthand notation Declaration and Initialization
       e2 := emp_details{Age: 10, salary: 45000} 
     fmt.Println(e2)
    }
    
    

    输出

    
    {miya 20 Mumbai 55 20000}
    { 10  0 45000}
    

解释

  •   定义了一个名为 emp_details 的结构体类型。
  •   与上面程序中讨论的相同,但我们使用了“:=”语法而不是 var 关键字来初始化结构体类型的值。只是用:=语法替换了 var。
    PHP : Struct
  •   输出与上一个程序相同。

    程序 3 声明时未初始化,默认类型为零值

    
    // Golang program to show how to  declare and define the struct  
    package main
    import "fmt"
    
     // Defining a struct type
    type emp_details struct {
        Name    string
        Age int
        Place string
        Id int
        salary int
    }  
    func main() {
    
    // Declaring a variable of a `struct` type
    // All the struct fields are initialized  with their zero value
    var e emp_details
    fmt.Println(e)
    }
    
    

    输出

    
    { 0  0 0}
    

解释

  •   上面的程序创建了一个 emp_details 类型的变量,该变量默认设置为零值。
  •   对于结构体数据类型,零值意味着结构体内的所有字段都设置为其相应的零值。
  •   因此,Name、Place 字段设置为“” (空字符串),Age、Id、Salary 字段设置为 0。
     

访问结构体字段

在 Golang 中,结构体字段通过点 (.) 运算符进行访问。使用点运算符可以轻松获取和设置 Golang 中的结构体字段。

在下面给出的程序中,创建了一个名为 emp_details 的结构体,它有 5 个字段。要访问并为字符串类型的 Name 字段赋值,我们使用以下语法
 

PHP : Struct

让我们通过示例来理解


// Golang program to show how to  declare and define the struct  
package main
import "fmt"
 // Defining a struct type
type emp_details struct {
    Name    string
    Age int
    Place string
    Id int
    salary int
}  
func main() {
  
    // Declaring a variable of a `struct` type
   // All the struct fields are initialized  with their zero value  
    var e emp_details
    //setting values using dot(.) operator
    e.Name = "Nainika"
    e.Age=5
    e.Place = "MALAYSIA"
    e.Id = 007
    e.salary = 100000
    //Displays output

输出


 e.Name : Nainika
 e.Age : 5
 e.Place : MALAYSIA
 e.Id: 7
 e.salary : 100000

Golang 嵌入结构体类型

在 Golang 结构体数据类型中,提供了一个名为嵌入的属性,它允许将一个结构体嵌入到另一个结构体中。结构体类型可以定义为另一个结构体类型。

  •    嵌入结构体也是一种嵌套结构体。
  •    当声明两个结构体类型,并且其中一个结构体类型利用父结构体类型进行初始化时,就会发生结构体嵌套。
  •    在下面的语法中,Address 是嵌套在另一个 emp_details 结构体类型中的结构体类型
  •    声明结构体类型后,使用:= 进行初始化。
  •    在下面给出的程序中,声明了一个 emp 变量,它使用 emp_details 结构体类型,其中初始化了 Name、Age 等自己的字段,并调用结构体类型 Address 来进一步使用其中定义的字段,如 city、country。
     

语法


type Address struct {
    City    string
    Country string
}

type emp_details struct {
    Name string
    Age int
    Address
}


package main

import "fmt"

type Address struct {
    city    string
    country string
}

type emp_details struct {
    name string
    age  int
    Address
}

func main() {
    emp := emp_details{
        name: "Joseph",
        age:  54,
        Address: Address{
            city:    "italy",
            country: "USA",
        },
    }

    fmt.Println("Name of employee:", emp.name)
    fmt.Println("Age:", emp.age)
    fmt.Println("City:", emp.city)
    fmt.Println("Country:", emp.country)
}

输出


Name of employee: Joseph
Age: 54
City: italy
Country: USA

Golang 中的结构体使用指针地址运算符

结构体数据类型的指针使用“&”运算符创建。所有变量都有内存位置,指针与 & 运算符一起用于访问变量操作数被分配到的内存位置,而 * 运算符用于访问该位置中保存的相应值。

示例: 


package main

import "fmt"
// declaration of struct type 
type emp_details struct {
 Age  int
 Name string
 Salary int 
}

func main() {
 var emp1 = &emp_details{40, "zen", 45000} // all values are shown
 fmt.Println(emp1)

 var emp2 = &emp_details{}
 emp2.Age = 10
 emp2.Name = "Vihan"
 fmt.Println(emp2) // salary not mentioned

 }

输出


&{40 zen 45000}
&{10 Vihan 0}

解释

  •    声明了一个 emp_details 结构体类型。
  •   下面的语法声明了变量 emp1,并使用指针 (&) 运算符来访问内存位置及其值。
    PHP : Struct
  •   另一种初始化方式 
    
    var emp2 = &emp;_details{}
    emp2.Age = 10
    emp2.Name = "Vihan"
    
    
  •   声明了变量 emp2 并为其分配结构体指针类型,然后使用点运算符访问字段并为相应字段初始化值。
  •   请查看上面程序的输出以获得更好的理解。