go专题-结构体struct

2022/2/10 go

    🌙 go结构体

    • go结构体是由一系列称之为字段的命名元素组成,每个元素都有一个名称和类型
    type identifier struct {
        field1 type1
        field2 type2
    }
    
    1
    2
    3
    4

    例如:

    type People struct {
        Name string
        Age int
    }
    
    type Student struct {
        class string
        People // 匿名字段,那么默认Student就包含了Person的所有字段
        int // 匿名字段
        string // 匿名字段
    }
    
    // 空结构体
    type Noop struct {}
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    • 结构体里的字段一般都有名字,像 field1、field2 等,如果字段在代码中从来也不会被用到,那么可以命名它为 _
    type Demo struct {
        x, y int
        u float32
        _ float32 // 填充
        A *[]int
        F func()
    }
    
    1
    2
    3
    4
    5
    6
    7
    • 使用new函数给一个新的结构体变量分配内存,返回指向已分配内存的指针:
    type S struct {
        a int
        b float64
    }
    // 使用new关键字
    new(S)
    
    1
    2
    3
    4
    5
    6

    new(S)为S类型变量分配内存,并初始化(a=0, b=0.0),返回包含该位置地址类型*S 的值

    • 结构体初始化方式
    type MyStruct struct {
        a int
        b float
    }
    
    // 1. v结构体类型变量
    var v MyStruct
    // 2. p指向结构体类型变量的指针
    var p *MyStruct
    
    // 1.按字段顺序初始化
    var m1 = MyStruct{1, 1.1}
    // 2.指定字段名称初始化
    var m2 = MyStruct{a: 1, b: 1.1}
    var m3 = MyStruct{b: 1.2}
    // 3.定义变量类型(分配内存,并零值化内存),然后赋值
    var m4 MyStruct
    m4.a = 2
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    • 结构体字面量
    type Point3D struct { x, y, z float64}
    type Line struct { p, q Point3D }
    
    // 申明并初始化
    var a = Point3D{}
    var b = Line{a, Point3D{3, 4, 5.5}}
    
    1
    2
    3
    4
    5
    6

    这里Point3D{}Point3D{3, 4, 5.5}都是结构体字面量

    • new(T)&T{}T{}

      • 表达式new(T)&T{}是等价的。&T{}是一种简写,底层仍然会调用new方法,返回结构体类型变量对应的指针。&T{} 不适用于内置类型。
      • T{}指定结构体类型
    • 带标签的结构体

    type Student struct {
        name string "学生姓名" // 结构体标签
        Age int "学生年龄" // 结构体标签
        Class int `json: cid` // 结构体标签
    }
    
    1
    2
    3
    4
    5

    通过reflect.TypeOf(T).Field(0).Tag方式可以获取结构体标签的内容