在Go语言中,结构体(Struct)是一种用户定义的数据类型,用于组合多个不同类型的字段,每个字段可以是任意的基本类型或其他结构体类型。结构体是一种复合数据类型,用于组织和存储相关的数据。
以下是结构体的一些基本概念和用法:
1. 定义结构体
// 定义一个结构体
type Person struct {
FirstName string
LastName string
Age int
}
// 创建结构体变量
var person1 Person
2. 初始化结构体
// 初始化结构体的字段
person1 := Person{
FirstName: "John",
LastName: "Doe",
Age: 30,
}
3. 访问结构体字段
// 访问结构体字段
fmt.Println(person1.FirstName) // 输出: John
fmt.Println(person1.LastName) // 输出: Doe
fmt.Println(person1.Age) // 输出: 30
4. 结构体嵌套
// 结构体嵌套
type Address struct {
City string
State string
}
type Employee struct {
Person // 匿名字段,结构体嵌套
Address // 匿名字段,结构体嵌套
Position string
}
// 创建结构体变量
employee1 := Employee{
Person: Person{
FirstName: "Alice",
LastName: "Smith",
Age: 25,
},
Address: Address{
City: "New York",
State: "NY",
},
Position: "Software Engineer",
}
5. 方法与结构体
在Go语言中,可以为结构体定义方法:
// 在结构体上定义方法
func (p Person) FullName() string {
return p.FirstName + " " + p.LastName
}
// 调用结构体方法
fullName := person1.FullName()
fmt.Println(fullName) // 输出: John Doe
6. 结构体的匿名字段
// 结构体的匿名字段
type Circle struct {
Radius float64
}
type Cylinder struct {
Circle // 匿名字段
Height float64
}
// 创建结构体变量
cylinder := Cylinder{
Circle: Circle{
Radius: 5.0,
},
Height: 10.0,
}
特性 | Go语言中的结构体 | C语言中的结构体 | Java中的类 |
---|---|---|---|
语法 | 使用 type 关键字定义结构体 |
使用 struct 关键字定义结构体 |
使用 class 关键字定义类 |
字段定义 | 字段名在前,类型在后 | 类型在前,字段名在后 | 类型在前,字段名在后 |
实例化 | 使用结构体字面量或 new 关键字 |
使用结构体字面量或 malloc 函数 |
使用 new 关键字或直接调用构造方法 |
匿名字段 | 支持匿名字段,可实现嵌套结构体 | 不支持直接的匿名字段,通过结构体嵌套实现 | 支持成员变量的直接定义和初始化 |
方法 | 使用关键字 func 定义方法,与结构体关联 |
不支持方法,通过函数操作结构体 | 使用关键字 public , private , protected 定义成员变量,通过方法操作 |
继承 | 不支持经典的继承,可以通过匿名字段模拟 | 不支持继承,通过结构体嵌套实现 | 支持单继承,可以通过 extends 关键字实现 |
多态 | 不支持经典的多态,可以通过接口实现 | 不支持多态 | 支持多态,通过方法重写和接口实现 |
构造函数 | 通过定义返回结构体的函数实现 | 无构造函数的概念 | 使用构造方法初始化对象 |
销毁 | 由垃圾收集器负责管理内存 | 使用 free 函数手动释放内存 |
由垃圾收集器负责管理内存 |
指针 | 不需要显式使用指针 | 可以使用指针,通过 * 操作符 |
不需要显式使用指针,内部通过引用操作 |