结构体
本文我们着重讲解一下Go语言中的结构体。
什么是结构体 ?
结构体是用户定义的数据类型,它表示了一组字段的集合。当我们需要把一组数据汇集成单一的逻辑单元而不是把这些数据各自处理成单独的类型。例如,雇员有姓氏、名称、年龄,那我们就可以把这三个字段构造成一个单独的结构体employee。
声明一个结构体
type Employee struct{
firstName string
lastName string
age int
}
上面的代码声明了一个结构体类型Employee,它有firstName,lastName, age这三个字段。这个结构体还可以更紧凑一些,我们可以把相同类型的字段放在同一行代码里面声明。例如,firstName和lastName都属于string类型,因此我们可以把上面的程序写成如下:
type Employee struct{
firstName,lastName string
age, salary int
}
上面的Employee结构体,我们称它为命名结构体,因为它创建了一个名为Employee的新类型。今后我们就可以使用Employee这个新类型创建一个Employee类型的结构体。
除此之外,在声明结构体时,还可以不声明一个新类型,这种类型的结构体被称为匿名结构体。
var employee struct {
firstName, lastName string
age int
}
上面的代码段创建了一个匿名结构体employee。
创建一个命名结构体
我们使用下面这个简单的程序来创建一个命名的结构体类型Employee。
package main
import (
"fmt"
)
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
//creating structure using field names
emp1 := Employee{
firstName: "Sam",
age: 25,
salary: 500,
lastName: "Anderson",
}
//creating structure without using field names
emp2 := Employee{"Thomas", "Paul", 29, 800}
fmt.Println("Employee 1", emp1)
fmt.Println("Employee 2", emp2)
}
在上面的程序中,我们定义了一个结构体类型Employee。我们又定义了一个结构体变量emp1,给它的每个字段都赋予了值。像这样的情况,字段名称的顺序没必要一定要和结构体声明时的顺序保持一致。
同时,我们还定义了一个结构体变量emp2,在定义emp2时,我们省略了字段名称,在这种情况,就必须使字段的顺序和声明结构体时的顺序保持一致。
程序的输出结构如下:
Employee 1 {Sam Anderson 25 500}
Employee 2 {Thomas Paul 29 800}
创建匿名结构体
package main
import (
"fmt"
)
func main() {
emp3 := struct {
firstName, lastName string
age, salary int
}{
firstName: "Andreah",
lastName: "Nikola",
age: 31,
salary: 5000,
}
fmt.Println("Employee 3", emp3)
}
在上面的程序中,我们定义了一个匿名结构体变量emp3。像我们之前提到的,这种结构体类型称为匿名结构体。因为它仅创建了一个结构体变量emp3,而并没有定义任何的新结构体类型。
程序的输出如下:
Employee 3 {Andreah Nikola 31 5000}
结构体的零值