关于go:Go-快速入门指南-嵌套结构体

2次阅读

共计 2409 个字符,预计需要花费 7 分钟才能阅读完成。

概述

Go 反对将多个构造体通过嵌套的形式,组成一个大的构造体,升高了单个构造体复杂度,同时进步了构造体之间组合的灵活性。

例子

为了省略篇幅,本大节只应用 字面量 形式初始化,new() 的初始化形式请参照 构造体 大节。

每个构造体独自初始化,最初组装

package main

import ("fmt")

type person struct {
    name string
    age  int16
    hobby
    profession
    address
}

type hobby struct {values []string
}

type profession struct {desc string}

type address struct {
    tel  string
    area string
}

func main() {
    // 这里应用单个字符作为变量名称,仅仅是为了演示,理论开发中要恪守命名标准
    h := hobby{values: []string{"读书", "羽毛球", "电影"},
    }

    p := profession{desc: "学生",}

    a := address{
        tel:  "123-456789",
        area: "XX 小区 1 栋 2 单元 304",
    }

    li := person{
        name:       "小李",
        age:        12,
        hobby:      h,
        profession: p,
        address:    a,
    }

    fmt.Printf("姓名: %s\n 年龄: %d\n 职业: %s\n 喜好: %v\n 电话: %s\n 住址: %s\n",
        li.name, li.age, li.profession.desc, li.hobby.values, li.address.tel, li.area)

    // 其中,嵌套的字段名能够省略
    fmt.Println("\n 省略掉嵌套的字段名,打印后果一样 \n")

    fmt.Printf("姓名: %s\n 年龄: %d\n 职业: %s\n 喜好: %v\n 电话: %s\n 住址: %s\n",
        li.name, li.age, li.desc, li.values, li.tel, li.area)
}

// $ go run main.go
// 输入如下 
/**
  姓名: 小李
  年龄: 12
  职业: 学生
  喜好: [读书 羽毛球 电影]
  电话: 123-456789
  住址: XX 小区 1 栋 2 单元 304

  省略掉嵌套的字段名,打印后果一样

  姓名: 小李
  年龄: 12
  职业: 学生
  喜好: [读书 羽毛球 电影]
  电话: 123-456789
  住址: XX 小区 1 栋 2 单元 304
*/

整个构造体初始化

package main

import ("fmt")

type person struct {
    name string
    age  int16
    hobby
    profession
    address
}

type hobby struct {values []string
}

type profession struct {desc string}

type address struct {
    tel  string
    area string
}

func main() {
    li := person{
        name: "小李",
        age:  12,
        hobby: hobby{values: []string{"读书", "羽毛球", "电影"},
        },
        profession: profession{desc: "学生",},
        address: address{
            tel:  "123-456789",
            area: "XX 小区 1 栋 2 单元 304",
        },
    }

    fmt.Printf("姓名: %s\n 年龄: %d\n 职业: %s\n 喜好: %v\n 电话: %s\n 住址: %s\n",
        li.name, li.age, li.desc, li.values, li.tel, li.area)
}

// $ go run main.go
// 输入如下 
/**
  姓名: 小李
  年龄: 12
  职业: 学生
  喜好: [读书 羽毛球 电影]
  电话: 123-456789
  住址: XX 小区 1 栋 2 单元 304
*/

打印构造体

package main

import ("fmt")

type person struct {
    name string
    age  int16
    hobby
    profession
    address
}

type hobby struct {values []string
}

type profession struct {desc string}

type address struct {
    tel  string
    area string
}

func main() {
    li := person{
        name: "小李",
        age:  12,
        hobby: hobby{values: []string{"读书", "羽毛球", "电影"},
        },
        profession: profession{desc: "学生",},
        address: address{
            tel:  "123-456789",
            area: "XX 小区 1 栋 2 单元 304",
        },
    }

    fmt.Println("默认打印输出如下")
    fmt.Println(li)

    fmt.Println("打印时加上字段名")
    fmt.Printf("%+v\n", li)

    fmt.Println("打印时加上嵌套字段名")
    fmt.Printf("%#v\n", li)
}

// $ go run main.go
// 输入如下 
/**
  默认打印输出如下
  {小李 12 {[ 读书 羽毛球 电影]} {学生} {123-456789 XX 小区 1 栋 2 单元 304}}

  打印时加上字段名
  {name: 小李 age:12 hobby:{values:[ 读书 羽毛球 电影]} profession:{desc: 学生} address:{tel:123-456789 area:XX 小区 1 栋 2 单元 304}}

  打印时加上嵌套字段名
  main.person{name:"小李", age:12, hobby:main.hobby{values:[]string{"读书", "羽毛球", "电影"}}, profession:main.profession{desc:"学生"}, address:main.address{tel:"123-456789", area:"XX 小区 1 栋 2 单元 304"}}
*/

扩大浏览

  1. 为什么有“组合优于继承”的说法 – 知乎

分割我

正文完
 0