首页 > 编程笔记 > Go语言笔记

Go语言结构体嵌套的用法

Go 语言中,结构体的每个成员可以设置不同的数据类型,如果某个成员的数据类型为结构体,就可以实现结构体间的嵌套。

结构体嵌套是将一个结构体成员设为另一个结构体,使结构体之间形成简单的递进关系,其语法结构如下:
type cars struct {
    name string
    price  int
}

type person struct {
    name string
    age int
    cars cars
}
上述语法定义了两个结构体,分别为 cars 和 person,其中结构体 person 的成员 cars 的数据类型指向结构体 cars,这样就能实现结构体嵌套。

在实例化 person 的时候,成员 cars 代表结构体 cars 的实例化变量,具体的使用方法如下:
package main

import "fmt"

func main() {
    type cars struct {
         name  string
         price int
    }

    type person struct {
         name string
         age  int
         cars cars
    }

    c := cars{name: "BWM", price: 500000}
    p := person{name: "Tim", age: 30, cars: c}
    fmt.Printf("个人名称:%v\n", p.name)
    fmt.Printf("个人年龄:%v\n", p.age)
    fmt.Printf("个人拥有车辆:%v\n", p.cars.name)
    fmt.Printf("车辆价钱为:%v\n", p.cars.price)
}
上述代码说明如下:
运行上述代码,运行结果为:

个人名称:Tim
个人年龄:30
个人拥有车辆:BWM
车辆价钱为:500000


结构体嵌套还可以使用匿名结构体实现,若遇到多重结构体嵌套,使用匿名结构体可以省去定义多个结构体,示例如下:
package main

import "fmt"

func main() {
    type cars struct {
         name  string
         price int
    }

    type person struct {
         name   string
         age    int
         cars   cars
         hourse struct {
              name  string
              price int
         }
    }

    c := cars{name: "BWM", price: 500000}
    p := person{name: "Tim", age: 30, cars: c}
    fmt.Printf("个人名称:%v\n", p.name)
    fmt.Printf("个人年龄:%v\n", p.age)
    fmt.Printf("个人拥有车辆:%v\n", p.cars.name)
    fmt.Printf("车辆价钱为:%v\n", p.cars.price)
}
我们在结构体 person 中定义了成员 hourse,它的数据类型是结构体,但以匿名结构体的方式定义,使用匿名结构体实现结构体嵌套能在代码中直观看出结构体的数据结构,但嵌套在内的结构体无法在其他代码中使用,某种程度上不符合代码复用的设计思想。

相关文章