10.1 结构体

Kesa...大约 2 分钟

10.1 结构体

  • 定义

    type identifier struct {
        field1 type1
        field2 type2
        ...
    }
    
  • new():为结构体变量分配内存并返回指针

    var t *T
    t = new(T)
    

    结构体变量中的字段值为对应类型的零值

  • 声明

    var t T
    

    声明也会为变量分配内存,结构体变量中的字段值为对应类型的零值

  • 初始化:可以使用字面量初始化 例如:

    type Interval struct {
        start int
        end   int
    }
    

    按顺序给出值:

    intr := Interval{0, 3}
    

    指定字段

    intr := Interval{end:5, start:1}
    

    忽略字段

    intr := Interval{end:5}
    

​ 使用 new() 初始化:

​ 作为结构体字面量初始化:

  • 访问字段:通过选择器符 (selector-notation) .

    var t T
    t.fieldName1
    t.fieldName2
    // 通过指针(会自动转换)
    t := new(T) // t: *T
    t.fieldName
    // 也可以显式解指针
    *t.fieldName
    
  • 结构体类型和字段的命名遵循可见性规则,一个导出的结构体类型中有些字段是导出的,另一些不是

结构体的内存布局

Go 语言中,结构体和它所包含的数据在内存中是以连续块的形式存在的

type Rect1 struct {Min, Max Point }
type Rect2 struct {Min, Max *Point }
image-20230504204811405
image-20230504204811405

递归结构体

结构体类型可以通过引用自身来定义。

链表:

这块的 data 字段用于存放有效数据(比如 float64),su 指针指向后继节点。

type Node struct {
    data    float64
    su      *Node
}

链表中的第一个元素叫 head,它指向第二个元素;最后一个元素叫 tail,它没有后继元素,所以它的 sunil 值。当然真实的链接会有很多数据节点,并且链表可以动态增长或收缩。

双向链表,它有一个前趋节点 pr 和一个后继节点 su

type Node struct {
    pr      *Node
    data    float64
    su      *Node
}

二叉树:

二叉树中每个节点最多能链接至两个节点:左节点 (le) 和右节点 (ri),这两个节点本身又可以有左右节点,依次类推。树的顶层节点叫根节点 (root),底层没有子节点的节点叫叶子节点 (leaves),叶子节点的 leri 指针为 nil 值。在 Go 中可以如下定义二叉树:

type Tree struct {
    le      *Tree
    data    float64
    ri      *Tree
}
上次编辑于:
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.2