Golang教程

关键字、标识符、语言特性

Preview
  • Golang 结构体的定义和使用
  • 1. 什么是Golang结构体
  • 2. Golang结构体的基本操作
  • 2.1 创建结构体
  • 2.2 访问结构体属性
  • 2.3 修改结构体属性
  • 2.4 结构体指针
  • 3. Golang结构体的注意事项
  • 3.1 结构体嵌套
  • 3.2 结构体匿名字段
  • 3.3 结构体的大小
  • 4. 总结

Golang 结构体的定义和使用

1. 什么是Golang结构体

Golang结构体是一种用户自定义的数据类型,可以封装多个属性,每个属性可以是任何类型。结构体是值类型,可以通过传递结构体的副本来传递数据。

结构体的定义方式如下:

type StructName struct {
    Field1 Type1
    Field2 Type2
    ...
    FieldN TypeN
}

其中,StructName为结构体的名称,Field1FieldN为结构体的属性名,Type1TypeN为结构体属性的类型。

2. Golang结构体的基本操作

2.1 创建结构体

可以使用字面量的方式创建一个结构体,例如:

type Person struct {
    Name string
    Age  int
}

p := Person{
    Name: "Alice",
    Age:  18,
}

上面的代码创建了一个名为Person的结构体,包含两个属性Name和Age,并初始化了一个名为p的变量。

2.2 访问结构体属性

可以使用点操作符.来访问结构体的属性,例如:

fmt.Println(p.Name)
fmt.Println(p.Age)

上面的代码分别获取了Person结构体变量p的Name和Age属性,并输出它们的值。

2.3 修改结构体属性

可以使用点操作符.来修改结构体的属性,例如:

p.Name = "Bob"
p.Age = 20

上面的代码修改了Person结构体变量p的Name和Age属性的值。

2.4 结构体指针

在Golang中,可以通过取地址符&来获取结构体的指针,例如:

p := Person{
    Name: "Alice",
    Age:  18,
}
pPtr := &p

上面的代码获取了Person结构体变量p的指针,并将其赋值给pPtr变量。可以通过*pPtr来访问和修改结构体的属性,例如:

fmt.Println((*pPtr).Name)
fmt.Println((*pPtr).Age)

上面的代码分别获取了结构体指针pPtr所指向的Person结构体变量的Name和Age属性,并输出它们的值。由于点操作符.的优先级高于取地址符&,因此需要使用括号将*pPtr括起来。

也可以使用箭头操作符->来访问和修改结构体的属性,例如:

fmt.Println(pPtr->Name)
fmt.Println(pPtr->Age)

上面的代码分别获取了结构体指针pPtr所指向的Person结构体变量的Name和Age属性,并输出它们的值。

3. Golang结构体的注意事项

3.1 结构体嵌套

可以在结构体中嵌套其他结构体,例如:

type Address struct {
    Province string
    City     string
}

type Person struct {
    Name    string
    Age     int
    Address Address
}

p := Person{
    Name: "Alice",
    Age:  18,
    Address: Address{
        Province: "Guangdong",
        City:     "Shenzhen",
    },
}

上面的代码定义了一个包含Address结构体的Person结构体,并初始化了一个名为p的变量。

3.2 结构体匿名字段

可以在结构体中定义匿名字段,例如:

type Address struct {
    Province string
    City     string
}

type Person struct {
    Name string
    Age  int
    Address
}

p := Person{
    Name: "Alice",
    Age:  18,
    Address: Address{
        Province: "Guangdong",
        City:     "Shenzhen",
    },
}

上面的代码定义了一个包含匿名字段Address的Person结构体,并初始化了一个名为p的变量。可以直接访问Person结构体变量p的Address属性,例如:

fmt.Println(p.Province)
fmt.Println(p.City)

上面的代码分别获取了Person结构体变量p的Address属性的Province和City属性值,并输出它们的值。

3.3 结构体的大小

结构体的大小是其所有成员变量大小的总和,但是可能会存在对齐的情况。可以使用unsafe包中的Sizeof函数来获取结构体的大小,例如:

import "unsafe"

type Person struct {
    Name string
    Age  int
}

size := unsafe.Sizeof(Person{})

上面的代码获取了Person结构体的大小,并将其赋值给变量size。

4. 总结

Golang结构体是一种用户自定义的数据类型,可以封装多个属性,并可以进行访问和修改。在使用结构体时,需要注意结构体嵌套、匿名字段和大小等问题。