GO语言结构体 | 青训营笔记

64 阅读5分钟

Go语言结构体

Go语言中的结构体是一种用户自定义的复合数据类型,类似于C语言中的结构体或者Java中的类。结构体可以包含多个字段,每个字段可以是不同的数据类型,可以用来表示一个实体的多个属性,并且可以在程序中进行操作。

定义结构体

Go语言中定义结构体的语法如下:

type 结构体名 struct {
    字段1 数据类型1
    字段2 数据类型2
    ...
}

其中,结构体名是结构体的名称,字段1字段2等是结构体的属性名称,数据类型1数据类型2等是属性的数据类型。

下面是一个简单的结构体定义示例:

type Person struct {
    Name string
    Age int
    Gender string
}

在上面的示例中,我们定义了一个名为Person的结构体,它包含了三个属性:NameAgeGender。其中,Name是字符串类型,Age是整数类型,Gender是字符串类型。

实例化结构体

在Go语言中,可以通过两种方式实例化结构体:一种是使用结构体字面量,另一种是使用new函数。

使用结构体字面量

使用结构体字面量可以快速地创建一个结构体实例,并对其属性进行初始化。具体语法如下:

p := Person{Name: "Alice", Age: 25, Gender: "Female"}

在上面的示例中,我们创建了一个Person结构体实例p,并对它的属性进行了初始化。可以看到,在使用结构体字面量时,需要按照属性的顺序指定属性值,也可以通过属性名来指定属性值。

使用new函数

使用new函数可以创建一个指向结构体的指针,并对其进行初始化。具体语法如下:

p := new(Person)
p.Name = "Alice"
p.Age = 25
p.Gender = "Female"

在上面的示例中,我们使用new函数创建了一个Person结构体的指针p,并对它的属性进行了初始化。可以看到,在使用new函数时,需要通过指针访问结构体属性,并对其进行赋值。

访问结构体属性

在Go语言中,可以使用.操作符来访问结构体的属性。具体语法如下:

p := Person{Name: "Alice", Age: 25, Gender: "Female"}
fmt.Println(p.Name)
fmt.Println(p.Age)
fmt.Println(p.Gender)

在上面的示例中,我们创建了一个Person结构体实例p,并使用.操作符访问了它的三个属性。注意,访问结构体属性时,需要在结构体实例变量名后面加上.操作符和属性名。

结构体方法

在Go语言中,可以为结构体定义方法,这些方法可以访问结构体的属性,并对其进行操作。定义结构体方法的语法如下:

func (接收器变量 接收器类型) 方法名(参数列表) 返回值列表 {
    // 方法体
}

其中,接收器变量是一个普通的函数参数,但它的类型必须是结构体类型,接收器类型是结构体类型的名称。

下面是一个结构体方法的示例:

type Person struct {
    Name string
    Age int
    Gender string
}

func (p Person) SayHello() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

在上面的示例中,我们为Person结构体定义了一个名为SayHello的方法,该方法可以打印出当前实例的名字和年龄。在方法定义中,我们使用了一个名为p的接收器变量,它的类型是Person,表示该方法是属于Person结构体的。

下面是使用结构体方法的示例:

p := Person{Name: "Alice", Age: 25, Gender: "Female"}
p.SayHello()  // 输出:Hello, my name is Alice and I am 25 years old.

在上面的示例中,我们创建了一个Person结构体实例p,并调用了它的SayHello方法。可以看到,该方法可以访问实例的属性,并对其进行操作。

结构体嵌套

在Go语言中,可以将一个结构体类型作为另一个结构体的字段类型,从而实现结构体的嵌套。结构体嵌套可以用来表示更复杂的实体,同时也可以方便地访问嵌套结构体的属性。

下面是一个结构体嵌套的示例:

type Address struct {
    Province string
    City string
}

type Person struct {
    Name string
    Age int
    Gender string
    Address Address
}

在上面的示例中,我们定义了两个结构体AddressPerson,其中Person结构体嵌套了Address结构体。Address结构体表示一个地址,包含了省份和城市两个属性;Person结构体表示一个人,包含了姓名、年龄、性别和地址四个属性。其中,地址属性的类型是Address结构体。

下面是访问嵌套结构体属性的示例:

p := Person{
    Name: "Alice",
    Age: 25,
    Gender: "Female",
    Address: Address{
        Province: "Guangdong",
        City: "Shenzhen",
    },
}
fmt.Println(p.Address.City)  // 输出:Shenzhen

在上面的示例中,我们创建了一个Person结构体实例p,并初始化了它的四个属性,其中地址属性使用了结构体字面量来初始化。可以看到,我们可以通过.操作符访问嵌套结构体Address的属性,从而获得地址的城市属性。

总结

本次笔记主要介绍了Go语言中结构体的定义、实例化、访问和方法等基本用法,并且介绍了结构体嵌套的概念。结构体是Go语言中非常重要的数据类型,它可以用来表示复杂的实体,并且可以方便地进行操作。在实际应用中,我们需要根据具体的场景来选择合适的结构体使用方式,以实现高效的编程。