首页 > 其他分享 >GO - 结构体嵌套

GO - 结构体嵌套

时间:2023-04-07 15:25:09浏览次数:33  
标签:string profession li 嵌套 address GO hobby main 结构

概述

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"}}
*/

标签:string,profession,li,嵌套,address,GO,hobby,main,结构
From: https://www.cnblogs.com/golandhome/p/17296270.html

相关文章

  • 006.系统目录结构
    Linux 系统目录结构登录系统后,在当前命令窗口下输入命令:ls/ 你会看到如下图所示: 树状目录结构:   以下是对这些目录的解释:/bin:常用bin是Binaries(二进制文件)的缩写,这个目录存放着最经常使用的命令。/root:常用该目录为系统管理员,也称作超级权限者的用户......
  • django记录基础操作日志
    1.新增middleware.py中间件:需要在setting.py注册classLoggingMiddleware:"""日志记录模块:操作用户、操作ip、请求路径、请求方式、请求时间"""def__init__(self,get_response):self.get_response=get_responsedef__call__(self,......
  • 用 Go 剑指 Offer 11. 旋转数组的最小数字
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,4,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,4]若旋转7次,则可以得到[0,1,4,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果为数......
  • golang TLS方式发送邮件
    packagemailimport( "crypto/tls" "errors" "fmt" "net/smtp" "net/textproto")typeloginAuthstruct{ username,passwordstring}//LoginAuthisfuncLoginAuth(usernamestring,passwordstring)......
  • 直播app开发,使用koa和MongoDB实现分页和模糊查询
    直播app开发,使用koa和MongoDB实现分页和模糊查询1.分页per_page:一页多少条数据page:第几页 //index.jsconstKoa=require('koa')constapp=newKoa()constRouter=require('koa-router')constusersRouter=newRouter({prefix:'/users'})//MongoDB数据库Us......
  • 视频剪辑工具,批量分割视频、合并视频、嵌套合并视频、支持添加字幕、调整色调
    最近有很多朋友在问,怎么剪辑视频,比如合并视频、分割视频、添加封面等等,该如何实现呢?今天小编给大家分享一个新的剪辑技巧,下面一起来试试吧。材料准备:一台Win系统的电脑安装一个好简单批量智剪视频素材若干步骤演示:步骤1:运行【好简单批量智剪】,其中有多个剪辑技巧,比如说分割视频,可以......
  • UVA - 757 Gone Fishing 贪心+枚举
    题目大意:有n个湖泊,每个湖泊最初的5分钟能钓到f条鱼,每五分钟减少d条鱼,鱼的数目不能小于d也不能为负数,求在h小时能钓到的鱼的最大数目和在每个池塘带了多少分钟解题思路:一个个枚举,如果用总时间减去到达另一个湖泊的时间的话,就表示它可以在两个湖泊随意行走了,然后在这些时间找到优解,并......
  • HDU - 3715 Go Deeper (二分 + 2-SAT)
    题目大意:给出一个递归函数,问这个递归函数最多能递归几层解题思路:二分枚举递归层数,然后依此建边如果给出的c[i]为0时,那么x[a[i]]和x[b[i]]中的其中一个要为真,连边即为!a[i]->b[i],!b[i]->a[i]如果给出的c[i]为1时,那么x[a[i]]和x[b[i]]两个要么都为真,要么都为假,连边即为a[i]->b[i......
  • Go-json源码解析
    代码例子如下:typeStudentstruct{Namestring`json:"name"`Ageint`json:"age"`}funcmain(){stu:=Student{Name:"张三",Age:21,}buf:=bytes.NewBuffer(make([]byte,0))//新建一个缓冲区......
  • Algorithm参数记录
    一、vector<Point2f>vector是一个存储二维点坐标的容器,其中每个元素都是一个Point2f类型的对象。在OpenCV中,Point2f表示一个由两个单精度浮点数构成的二维点坐标。你可以使用vector来存储一些二维坐标信息,比如图像中的关键点或轮廓点等。具体用法可以参考下面的示例:#include<o......