GO 复合数据类型(三)结构体

213 阅读1分钟

type

type t type_name

  • 相同底层类型可以显示转换不能隐式

type t = type_name

  • 可以隐式转换

结构体

结构体定义

  • 类型字面值
    • 导出类型
    • 非导出类型
    • "_"空标识类型,主动内存填充
  • 特殊类型
    • 空结构体 作为Gorouting通信
    • 其他结构体作为字段类型,只用写类型(匿名字段)
    • 不能包含自身,但可以是自己的指针、自身作为value的map、切片

一个类型,它所占用的大小是固定的,因此一个结构体定义好的时候,其大小是固定的。 但是,如果结构体里面套结构体,那么在计算该结构体占用大小的时候,就会成死循环。切片、指针等大小都是固定的。

初始化

不是零值可用

  • 逐一赋值
    • 字段多时麻烦,且字段修改后,赋值也要修改
    • 不建议非导出字段逐一赋值,编译能通过,官方不支持
  • field:value形式复合字面值
    • 类型零值也采用该形式t := T{}
  • 构造函数
    • 对结构体中非导出字段的复杂结构体,用特定的构造函数初始化。

内存结构与内存对齐

结构体的字段在内存中是连续的,所以需要内存对齐即所有字段中的最长字段长度与系统对齐系数较小的整数倍,64bit操作系统对齐系数通常为8。字段对齐后,整个结构体还需要对齐。

字段排列顺序不同,内存大小也不同。 内存填充编译器自动完成,也可以通过“_”主动填充