📜  如何在 Golang 中使用结构体字面量创建结构体实例?

📅  最后修改于: 2021-10-24 14:12:41             🧑  作者: Mango

Golang 中的结构体或结构体是一种用户定义的数据类型,它是各种数据字段的组合。每个数据字段都有自己的数据类型,可以是内置类型,也可以是其他用户定义的类型。 Struct 代表任何具有某些属性/字段集的现实世界实体。

例如,学生有姓名、卷号、城市、部门。将这四个属性组合到一个结构地址中是有意义的,如下所示。

type Student struct {
      name string 
      roll_no int
      city string
      department string
}

声明结构的语法:

var x Student

上面的代码创建了一个 Student 类型的变量,其中的字段默认设置为各自的零值

由于 struct 是复合数据类型,因此它使用复合字面量初始化。复合字面量为结构、数组、切片和映射构造值,其中对这些类型使用单一语法。结构体字面量用于在 Golang 中创建结构体实例。您可以使用结构字面量创建结构实例,如下所示:

var d = Student{"Akshay", 1, "Lucknow", "Computer Science"}

我们还可以使用简短的声明运算符。

d := Student{"Akshay", 1, "Lucknow", "Computer Science"} 

创建结构体字面量时,您必须牢记以下规则:

  1. 键必须是在结构类型中声明的字段名称。
  2. 不包含任何键的元素列表必须按照字段声明的顺序为每个结构字段列出一个元素。
  3. 包含键的元素列表不需要为每个结构字段都有一个元素。省略的字段获得该字段的零值。
  4. 字面量可以省略元素列表;这种字面量的计算结果为零值。
  5. 为属于不同包的结构的非导出字段指定元素是错误的。

示例 1:

// Golang program to show how to
// declare and define the struct
// using struct literal
package main
  
// importing required modules
import "fmt"
  
// Defining a struct type
type Student struct {
    name       string
    roll_no    int
    city       string
    department string
}
  
func main() {
  
    // Declaring a variable of a `struct` type
    // All the struct fields are initialized
    // with their zero value
    var x Student
    fmt.Println("Student0:", x)
  
    // Declaring and initializing a
    // struct using a struct literal
    // Fields should be initialised in
    // the same order as they are declared
    // in struct's definition
    x1 := Student{"Akshay", 1, "Lucknow", "Computer Science"}
      
    fmt.Println("Student1: ", x1)
  
    // You can specify keys for 
    // their respective values
    x2 := Student{name: "Anita", roll_no: 2, 
     city: "Ballia", department: "Mechanical"}
      
    fmt.Println("Student2: ", x2)
}

输出:

Student0: { 0  }
Student1:  {Akshay 1 Lucknow Computer Science}
Student2:  {Anita 2 Ballia Mechanical}

未初始化的字段设置为其相应的零值。

示例 2:

// Golang program illustrating
// the use of string literals
package main
  
// importing required modules
import "fmt"
  
// Defining a struct type
type Address struct {
    name, city string
    Pincode    int
}
  
func main() {
    add1 := Address{name: "Ram"}
    fmt.Println("Address is:", add1)
}

输出:

Address is: {Ram  0}

必须注意,在实例化期间使用field:value初始值设定项时,未初始化的值将设置为零值。以下代码将输出错误。

例子:

// Golang program illustrating
// the use of string literals
package main
  
// importing required modules
import "fmt"
  
// Defining a struct type
type Address struct {
    name, city string
    Pincode    int
}
  
func main() {
    add1 := Address{"Ram"}
    fmt.Println("Address is: ", add1)
}

输出:

Compilation Error: too few values in Address literal

如果您为元素指定至少一个键,那么您还必须指定所有其他键。

例子:

package main
  
// importing required modules
import "fmt"
  
// Defining a struct type
type Address struct {
    name, city string
    Pincode    int
}
  
func main() {
    // Only 1 key is specified here
    add1 := Address{name: "Ram", "Mumbai", 221007}
    fmt.Println("Address is: ", add1)
}

输出:

Compilation Error: mixture of field:value and value initializers

上面的程序抛出了一个错误,因为我们只为一个元素指定了键,并且创建了field:value和 value 初始值设定项的混合。我们应该使用field:value或 value 初始值设定项。